home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / test / test_descr.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  154KB  |  5,753 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. from test.test_support import verify, vereq, verbose, TestFailed, TESTFN, get_original_stdout
  5. from copy import deepcopy
  6. import warnings
  7. warnings.filterwarnings('ignore', 'complex divmod\\(\\), // and % are deprecated$', DeprecationWarning, '(<string>|%s)$' % __name__)
  8.  
  9. def veris(a, b):
  10.     if a is not b:
  11.         raise TestFailed, '%r is %r' % (a, b)
  12.     
  13.  
  14.  
  15. def testunop(a, res, expr = 'len(a)', meth = '__len__'):
  16.     if verbose:
  17.         print 'checking', expr
  18.     
  19.     dict = {
  20.         'a': a }
  21.     vereq(eval(expr, dict), res)
  22.     t = type(a)
  23.     m = getattr(t, meth)
  24.     while meth not in t.__dict__:
  25.         t = t.__bases__[0]
  26.     vereq(m, t.__dict__[meth])
  27.     vereq(m(a), res)
  28.     bm = getattr(a, meth)
  29.     vereq(bm(), res)
  30.  
  31.  
  32. def testbinop(a, b, res, expr = 'a+b', meth = '__add__'):
  33.     if verbose:
  34.         print 'checking', expr
  35.     
  36.     dict = {
  37.         'a': a,
  38.         'b': b }
  39.     if meth == '__div__' and 1 / 2 == 0.5:
  40.         meth = '__truediv__'
  41.     
  42.     vereq(eval(expr, dict), res)
  43.     t = type(a)
  44.     m = getattr(t, meth)
  45.     while meth not in t.__dict__:
  46.         t = t.__bases__[0]
  47.     vereq(m, t.__dict__[meth])
  48.     vereq(m(a, b), res)
  49.     bm = getattr(a, meth)
  50.     vereq(bm(b), res)
  51.  
  52.  
  53. def testternop(a, b, c, res, expr = 'a[b:c]', meth = '__getslice__'):
  54.     if verbose:
  55.         print 'checking', expr
  56.     
  57.     dict = {
  58.         'a': a,
  59.         'b': b,
  60.         'c': c }
  61.     vereq(eval(expr, dict), res)
  62.     t = type(a)
  63.     m = getattr(t, meth)
  64.     while meth not in t.__dict__:
  65.         t = t.__bases__[0]
  66.     vereq(m, t.__dict__[meth])
  67.     vereq(m(a, b, c), res)
  68.     bm = getattr(a, meth)
  69.     vereq(bm(b, c), res)
  70.  
  71.  
  72. def testsetop(a, b, res, stmt = 'a+=b', meth = '__iadd__'):
  73.     if verbose:
  74.         print 'checking', stmt
  75.     
  76.     dict = {
  77.         'a': deepcopy(a),
  78.         'b': b }
  79.     exec stmt in dict
  80.     vereq(dict['a'], res)
  81.     t = type(a)
  82.     m = getattr(t, meth)
  83.     while meth not in t.__dict__:
  84.         t = t.__bases__[0]
  85.     vereq(m, t.__dict__[meth])
  86.     dict['a'] = deepcopy(a)
  87.     m(dict['a'], b)
  88.     vereq(dict['a'], res)
  89.     dict['a'] = deepcopy(a)
  90.     bm = getattr(dict['a'], meth)
  91.     bm(b)
  92.     vereq(dict['a'], res)
  93.  
  94.  
  95. def testset2op(a, b, c, res, stmt = 'a[b]=c', meth = '__setitem__'):
  96.     if verbose:
  97.         print 'checking', stmt
  98.     
  99.     dict = {
  100.         'a': deepcopy(a),
  101.         'b': b,
  102.         'c': c }
  103.     exec stmt in dict
  104.     vereq(dict['a'], res)
  105.     t = type(a)
  106.     m = getattr(t, meth)
  107.     while meth not in t.__dict__:
  108.         t = t.__bases__[0]
  109.     vereq(m, t.__dict__[meth])
  110.     dict['a'] = deepcopy(a)
  111.     m(dict['a'], b, c)
  112.     vereq(dict['a'], res)
  113.     dict['a'] = deepcopy(a)
  114.     bm = getattr(dict['a'], meth)
  115.     bm(b, c)
  116.     vereq(dict['a'], res)
  117.  
  118.  
  119. def testset3op(a, b, c, d, res, stmt = 'a[b:c]=d', meth = '__setslice__'):
  120.     if verbose:
  121.         print 'checking', stmt
  122.     
  123.     dict = {
  124.         'a': deepcopy(a),
  125.         'b': b,
  126.         'c': c,
  127.         'd': d }
  128.     exec stmt in dict
  129.     vereq(dict['a'], res)
  130.     t = type(a)
  131.     while meth not in t.__dict__:
  132.         t = t.__bases__[0]
  133.     m = getattr(t, meth)
  134.     vereq(m, t.__dict__[meth])
  135.     dict['a'] = deepcopy(a)
  136.     m(dict['a'], b, c, d)
  137.     vereq(dict['a'], res)
  138.     dict['a'] = deepcopy(a)
  139.     bm = getattr(dict['a'], meth)
  140.     bm(b, c, d)
  141.     vereq(dict['a'], res)
  142.  
  143.  
  144. def class_docstrings():
  145.     
  146.     class Classic:
  147.         '''A classic docstring.'''
  148.         pass
  149.  
  150.     vereq(Classic.__doc__, 'A classic docstring.')
  151.     vereq(Classic.__dict__['__doc__'], 'A classic docstring.')
  152.     
  153.     class Classic2:
  154.         pass
  155.  
  156.     verify(Classic2.__doc__ is None)
  157.     
  158.     class NewStatic(object):
  159.         '''Another docstring.'''
  160.         pass
  161.  
  162.     vereq(NewStatic.__doc__, 'Another docstring.')
  163.     vereq(NewStatic.__dict__['__doc__'], 'Another docstring.')
  164.     
  165.     class NewStatic2(object):
  166.         pass
  167.  
  168.     verify(NewStatic2.__doc__ is None)
  169.     
  170.     class NewDynamic(object):
  171.         '''Another docstring.'''
  172.         pass
  173.  
  174.     vereq(NewDynamic.__doc__, 'Another docstring.')
  175.     vereq(NewDynamic.__dict__['__doc__'], 'Another docstring.')
  176.     
  177.     class NewDynamic2(object):
  178.         pass
  179.  
  180.     verify(NewDynamic2.__doc__ is None)
  181.  
  182.  
  183. def lists():
  184.     if verbose:
  185.         print 'Testing list operations...'
  186.     
  187.     testbinop([
  188.         1], [
  189.         2], [
  190.         1,
  191.         2], 'a+b', '__add__')
  192.     testbinop([
  193.         1,
  194.         2,
  195.         3], 2, 1, 'b in a', '__contains__')
  196.     testbinop([
  197.         1,
  198.         2,
  199.         3], 4, 0, 'b in a', '__contains__')
  200.     testbinop([
  201.         1,
  202.         2,
  203.         3], 1, 2, 'a[b]', '__getitem__')
  204.     testternop([
  205.         1,
  206.         2,
  207.         3], 0, 2, [
  208.         1,
  209.         2], 'a[b:c]', '__getslice__')
  210.     testsetop([
  211.         1], [
  212.         2], [
  213.         1,
  214.         2], 'a+=b', '__iadd__')
  215.     testsetop([
  216.         1,
  217.         2], 3, [
  218.         1,
  219.         2,
  220.         1,
  221.         2,
  222.         1,
  223.         2], 'a*=b', '__imul__')
  224.     testunop([
  225.         1,
  226.         2,
  227.         3], 3, 'len(a)', '__len__')
  228.     testbinop([
  229.         1,
  230.         2], 3, [
  231.         1,
  232.         2,
  233.         1,
  234.         2,
  235.         1,
  236.         2], 'a*b', '__mul__')
  237.     testbinop([
  238.         1,
  239.         2], 3, [
  240.         1,
  241.         2,
  242.         1,
  243.         2,
  244.         1,
  245.         2], 'b*a', '__rmul__')
  246.     testset2op([
  247.         1,
  248.         2], 1, 3, [
  249.         1,
  250.         3], 'a[b]=c', '__setitem__')
  251.     testset3op([
  252.         1,
  253.         2,
  254.         3,
  255.         4], 1, 3, [
  256.         5,
  257.         6], [
  258.         1,
  259.         5,
  260.         6,
  261.         4], 'a[b:c]=d', '__setslice__')
  262.  
  263.  
  264. def dicts():
  265.     if verbose:
  266.         print 'Testing dict operations...'
  267.     
  268.     testbinop({
  269.         1: 2 }, {
  270.         2: 1 }, -1, 'cmp(a,b)', '__cmp__')
  271.     testbinop({
  272.         1: 2,
  273.         3: 4 }, 1, 1, 'b in a', '__contains__')
  274.     testbinop({
  275.         1: 2,
  276.         3: 4 }, 2, 0, 'b in a', '__contains__')
  277.     testbinop({
  278.         1: 2,
  279.         3: 4 }, 1, 2, 'a[b]', '__getitem__')
  280.     d = {
  281.         1: 2,
  282.         3: 4 }
  283.     l1 = []
  284.     for i in d.keys():
  285.         l1.append(i)
  286.     
  287.     l = []
  288.     for i in iter(d):
  289.         l.append(i)
  290.     
  291.     vereq(l, l1)
  292.     l = []
  293.     for i in d.__iter__():
  294.         l.append(i)
  295.     
  296.     vereq(l, l1)
  297.     l = []
  298.     for i in dict.__iter__(d):
  299.         l.append(i)
  300.     
  301.     vereq(l, l1)
  302.     d = {
  303.         1: 2,
  304.         3: 4 }
  305.     testunop(d, 2, 'len(a)', '__len__')
  306.     vereq(eval(repr(d), { }), d)
  307.     vereq(eval(d.__repr__(), { }), d)
  308.     testset2op({
  309.         1: 2,
  310.         3: 4 }, 2, 3, {
  311.         1: 2,
  312.         2: 3,
  313.         3: 4 }, 'a[b]=c', '__setitem__')
  314.  
  315.  
  316. def dict_constructor():
  317.     if verbose:
  318.         print 'Testing dict constructor ...'
  319.     
  320.     d = dict()
  321.     vereq(d, { })
  322.     d = dict({ })
  323.     vereq(d, { })
  324.     d = dict({
  325.         1: 2,
  326.         'a': 'b' })
  327.     vereq(d, {
  328.         1: 2,
  329.         'a': 'b' })
  330.     vereq(d, dict(d.items()))
  331.     vereq(d, dict(d.iteritems()))
  332.     d = dict({
  333.         'one': 1,
  334.         'two': 2 })
  335.     vereq(d, dict(one = 1, two = 2))
  336.     vereq(d, dict(**d))
  337.     vereq(d, dict({
  338.         'one': 1 }, two = 2))
  339.     vereq(d, dict([
  340.         ('two', 2)], one = 1))
  341.     vereq(d, dict([
  342.         ('one', 100),
  343.         ('two', 200)], **d))
  344.     verify(d is not dict(**d))
  345.     for badarg in (0, 0x0L, (0.0+0.0j), '0', [
  346.         0], (0,)):
  347.         
  348.         try:
  349.             dict(badarg)
  350.         except TypeError:
  351.             continue
  352.             except ValueError:
  353.                 if badarg == '0':
  354.                     pass
  355.                 else:
  356.                     raise TestFailed('no TypeError from dict(%r)' % badarg)
  357.                 badarg == '0'
  358.             else:
  359.                 raise TestFailed('no TypeError from dict(%r)' % badarg)
  360.         try:
  361.             dict({ }, { })
  362.         except TypeError:
  363.             pass
  364.  
  365.         raise TestFailed('no TypeError from dict({}, {})')
  366.         
  367.         class Mapping:
  368.             dict = {
  369.                 1: 2,
  370.                 3: 4,
  371.                 'a': (0.0+1.0j) }
  372.  
  373.         
  374.         try:
  375.             dict(Mapping())
  376.         except TypeError:
  377.             pass
  378.  
  379.         raise TestFailed('no TypeError from dict(incomplete mapping)')
  380.         
  381.         Mapping.keys = lambda self: self.dict.keys()
  382.         
  383.         Mapping.__getitem__ = lambda self, i: self.dict[i]
  384.         d = dict(Mapping())
  385.         vereq(d, Mapping.dict)
  386.         
  387.         class AddressBookEntry:
  388.             
  389.             def __init__(self, first, last):
  390.                 self.first = first
  391.                 self.last = last
  392.  
  393.             
  394.             def __iter__(self):
  395.                 return iter([
  396.                     self.first,
  397.                     self.last])
  398.  
  399.  
  400.         d = dict([
  401.             AddressBookEntry('Tim', 'Warsaw'),
  402.             AddressBookEntry('Barry', 'Peters'),
  403.             AddressBookEntry('Tim', 'Peters'),
  404.             AddressBookEntry('Barry', 'Warsaw')])
  405.         vereq(d, {
  406.             'Barry': 'Warsaw',
  407.             'Tim': 'Peters' })
  408.         d = dict(zip(range(4), range(1, 5)))
  409.         dict([], []([ (i, i + 1) for i in range(4) ]))
  410.         for bad in ([
  411.             ('tooshort',)], [
  412.             ('too', 'long', 'by 1')]):
  413.             
  414.             try:
  415.                 dict(bad)
  416.             except ValueError:
  417.                 d
  418.                 d
  419.                 vereq
  420.                 continue
  421.  
  422.             raise TestFailed('no ValueError from dict(%r)' % bad)
  423.         
  424.  
  425.  
  426. def test_dir():
  427.     if verbose:
  428.         print 'Testing dir() ...'
  429.     
  430.     junk = 12
  431.     vereq(dir(), [
  432.         'junk'])
  433.     del junk
  434.     for arg in (2, 0x2L, (0.0+2.0j), 2.0, [
  435.         2], '2', u'2', (2,), {
  436.         2: 2 }, type, test_dir):
  437.         dir(arg)
  438.     
  439.     
  440.     class C:
  441.         Cdata = 1
  442.         
  443.         def Cmethod(self):
  444.             pass
  445.  
  446.  
  447.     cstuff = [
  448.         'Cdata',
  449.         'Cmethod',
  450.         '__doc__',
  451.         '__module__']
  452.     vereq(dir(C), cstuff)
  453.     verify('im_self' in dir(C.Cmethod))
  454.     c = C()
  455.     vereq(dir(c), cstuff)
  456.     c.cdata = 2
  457.     
  458.     c.cmethod = lambda self: 0
  459.     vereq(dir(c), cstuff + [
  460.         'cdata',
  461.         'cmethod'])
  462.     verify('im_self' in dir(c.Cmethod))
  463.     
  464.     class A(C):
  465.         Adata = 1
  466.         
  467.         def Amethod(self):
  468.             pass
  469.  
  470.  
  471.     astuff = [
  472.         'Adata',
  473.         'Amethod'] + cstuff
  474.     vereq(dir(A), astuff)
  475.     verify('im_self' in dir(A.Amethod))
  476.     a = A()
  477.     vereq(dir(a), astuff)
  478.     verify('im_self' in dir(a.Amethod))
  479.     a.adata = 42
  480.     
  481.     a.amethod = lambda self: 3
  482.     vereq(dir(a), astuff + [
  483.         'adata',
  484.         'amethod'])
  485.     
  486.     def interesting(strings):
  487.         return _[1]
  488.  
  489.     
  490.     class C(object):
  491.         Cdata = 1
  492.         
  493.         def Cmethod(self):
  494.             pass
  495.  
  496.  
  497.     cstuff = [
  498.         'Cdata',
  499.         'Cmethod']
  500.     vereq(interesting(dir(C)), cstuff)
  501.     c = C()
  502.     vereq(interesting(dir(c)), cstuff)
  503.     verify('im_self' in dir(C.Cmethod))
  504.     c.cdata = 2
  505.     
  506.     c.cmethod = lambda self: 0
  507.     vereq(interesting(dir(c)), cstuff + [
  508.         'cdata',
  509.         'cmethod'])
  510.     verify('im_self' in dir(c.Cmethod))
  511.     
  512.     class A(C):
  513.         Adata = 1
  514.         
  515.         def Amethod(self):
  516.             pass
  517.  
  518.  
  519.     astuff = [
  520.         'Adata',
  521.         'Amethod'] + cstuff
  522.     vereq(interesting(dir(A)), astuff)
  523.     verify('im_self' in dir(A.Amethod))
  524.     a = A()
  525.     vereq(interesting(dir(a)), astuff)
  526.     a.adata = 42
  527.     
  528.     a.amethod = lambda self: 3
  529.     vereq(interesting(dir(a)), astuff + [
  530.         'adata',
  531.         'amethod'])
  532.     verify('im_self' in dir(a.Amethod))
  533.     import sys as sys
  534.     
  535.     class M(type(sys)):
  536.         pass
  537.  
  538.     minstance = M('m')
  539.     minstance.b = 2
  540.     minstance.a = 1
  541.     names = _[1]
  542.     vereq(names, [
  543.         'a',
  544.         'b'])
  545.     
  546.     class M2(M):
  547.         
  548.         def getdict(self):
  549.             return 'Not a dict!'
  550.  
  551.         __dict__ = property(getdict)
  552.  
  553.     m2instance = M2('m2')
  554.     m2instance.b = 2
  555.     m2instance.a = 1
  556.     vereq(m2instance.__dict__, 'Not a dict!')
  557.     
  558.     try:
  559.         dir(m2instance)
  560.     except TypeError:
  561.         []
  562.         []
  563.         []
  564.     except:
  565.         []
  566.  
  567.     vereq(dir(None), dir(Ellipsis))
  568.     
  569.     class Wrapper(object):
  570.         
  571.         def __init__(self, obj):
  572.             self._Wrapper__obj = obj
  573.  
  574.         
  575.         def __repr__(self):
  576.             return 'Wrapper(%s)' % repr(self._Wrapper__obj)
  577.  
  578.         
  579.         def __getitem__(self, key):
  580.             return Wrapper(self._Wrapper__obj[key])
  581.  
  582.         
  583.         def __len__(self):
  584.             return len(self._Wrapper__obj)
  585.  
  586.         
  587.         def __getattr__(self, name):
  588.             return Wrapper(getattr(self._Wrapper__obj, name))
  589.  
  590.  
  591.     
  592.     class C(object):
  593.         
  594.         def __getclass(self):
  595.             return Wrapper(type(self))
  596.  
  597.         __class__ = property(__getclass)
  598.  
  599.     dir(C())
  600.  
  601. binops = {
  602.     'add': '+',
  603.     'sub': '-',
  604.     'mul': '*',
  605.     'div': '/',
  606.     'mod': '%',
  607.     'divmod': 'divmod',
  608.     'pow': '**',
  609.     'lshift': '<<',
  610.     'rshift': '>>',
  611.     'and': '&',
  612.     'xor': '^',
  613.     'or': '|',
  614.     'cmp': 'cmp',
  615.     'lt': '<',
  616.     'le': '<=',
  617.     'eq': '==',
  618.     'ne': '!=',
  619.     'gt': '>',
  620.     'ge': '>=' }
  621. for name, expr in binops.items():
  622.     if expr.islower():
  623.         expr = expr + '(a, b)'
  624.     else:
  625.         expr = 'a %s b' % expr
  626.     binops[name] = expr
  627.  
  628. unops = {
  629.     'pos': '+',
  630.     'neg': '-',
  631.     'abs': 'abs',
  632.     'invert': '~',
  633.     'int': 'int',
  634.     'long': 'long',
  635.     'float': 'float',
  636.     'oct': 'oct',
  637.     'hex': 'hex' }
  638. for name, expr in unops.items():
  639.     if expr.islower():
  640.         expr = expr + '(a)'
  641.     else:
  642.         expr = '%s a' % expr
  643.     unops[name] = expr
  644.  
  645.  
  646. def numops(a, b, skip = []):
  647.     dict = {
  648.         'a': a,
  649.         'b': b }
  650.     for name, expr in binops.items():
  651.         if name not in skip:
  652.             name = '__%s__' % name
  653.             if hasattr(a, name):
  654.                 res = eval(expr, dict)
  655.                 testbinop(a, b, res, expr, name)
  656.             
  657.         hasattr(a, name)
  658.     
  659.     for name, expr in unops.items():
  660.         if name not in skip:
  661.             name = '__%s__' % name
  662.             if hasattr(a, name):
  663.                 res = eval(expr, dict)
  664.                 testunop(a, res, expr, name)
  665.             
  666.         hasattr(a, name)
  667.     
  668.  
  669.  
  670. def ints():
  671.     if verbose:
  672.         print 'Testing int operations...'
  673.     
  674.     numops(100, 3)
  675.     vereq(1.__nonzero__(), 1)
  676.     vereq(0.__nonzero__(), 0)
  677.     
  678.     class C(int):
  679.         
  680.         def __add__(self, other):
  681.             return NotImplemented
  682.  
  683.  
  684.     vereq(C(0x5L), 5)
  685.     
  686.     try:
  687.         C() + ''
  688.     except TypeError:
  689.         pass
  690.  
  691.     raise TestFailed, 'NotImplemented should have caused TypeError'
  692.     import sys
  693.     
  694.     try:
  695.         C(sys.maxint + 1)
  696.     except OverflowError:
  697.         pass
  698.  
  699.     raise TestFailed, 'should have raised OverflowError'
  700.  
  701.  
  702. def longs():
  703.     if verbose:
  704.         print 'Testing long operations...'
  705.     
  706.     numops(0x64L, 0x3L)
  707.  
  708.  
  709. def floats():
  710.     if verbose:
  711.         print 'Testing float operations...'
  712.     
  713.     numops(100.0, 3.0)
  714.  
  715.  
  716. def complexes():
  717.     if verbose:
  718.         print 'Testing complex operations...'
  719.     
  720.     numops((0.0+100.0j), (0.0+3.0j), skip = [
  721.         'lt',
  722.         'le',
  723.         'gt',
  724.         'ge',
  725.         'int',
  726.         'long',
  727.         'float'])
  728.     
  729.     class Number(complex):
  730.         __slots__ = [
  731.             'prec']
  732.         
  733.         def __new__(cls, *args, **kwds):
  734.             result = complex.__new__(cls, *args)
  735.             result.prec = kwds.get('prec', 12)
  736.             return result
  737.  
  738.         
  739.         def __repr__(self):
  740.             prec = self.prec
  741.             if self.imag == 0.0:
  742.                 return '%.*g' % (prec, self.real)
  743.             
  744.             if self.real == 0.0:
  745.                 return '%.*gj' % (prec, self.imag)
  746.             
  747.             return '(%.*g+%.*gj)' % (prec, self.real, prec, self.imag)
  748.  
  749.         __str__ = __repr__
  750.  
  751.     a = Number(3.1400000000000001, prec = 6)
  752.     vereq(repr(a), '3.14')
  753.     vereq(a.prec, 6)
  754.     a = Number(a, prec = 2)
  755.     vereq(repr(a), '3.1')
  756.     vereq(a.prec, 2)
  757.     a = Number(234.5)
  758.     vereq(repr(a), '234.5')
  759.     vereq(a.prec, 12)
  760.  
  761.  
  762. def spamlists():
  763.     if verbose:
  764.         print 'Testing spamlist operations...'
  765.     
  766.     import copy as copy
  767.     import xxsubtype as spam
  768.     
  769.     def spamlist(l, memo = None):
  770.         import xxsubtype as spam
  771.         return spam.spamlist(l)
  772.  
  773.     copy._deepcopy_dispatch[spam.spamlist] = spamlist
  774.     testbinop(spamlist([
  775.         1]), spamlist([
  776.         2]), spamlist([
  777.         1,
  778.         2]), 'a+b', '__add__')
  779.     testbinop(spamlist([
  780.         1,
  781.         2,
  782.         3]), 2, 1, 'b in a', '__contains__')
  783.     testbinop(spamlist([
  784.         1,
  785.         2,
  786.         3]), 4, 0, 'b in a', '__contains__')
  787.     testbinop(spamlist([
  788.         1,
  789.         2,
  790.         3]), 1, 2, 'a[b]', '__getitem__')
  791.     testternop(spamlist([
  792.         1,
  793.         2,
  794.         3]), 0, 2, spamlist([
  795.         1,
  796.         2]), 'a[b:c]', '__getslice__')
  797.     testsetop(spamlist([
  798.         1]), spamlist([
  799.         2]), spamlist([
  800.         1,
  801.         2]), 'a+=b', '__iadd__')
  802.     testsetop(spamlist([
  803.         1,
  804.         2]), 3, spamlist([
  805.         1,
  806.         2,
  807.         1,
  808.         2,
  809.         1,
  810.         2]), 'a*=b', '__imul__')
  811.     testunop(spamlist([
  812.         1,
  813.         2,
  814.         3]), 3, 'len(a)', '__len__')
  815.     testbinop(spamlist([
  816.         1,
  817.         2]), 3, spamlist([
  818.         1,
  819.         2,
  820.         1,
  821.         2,
  822.         1,
  823.         2]), 'a*b', '__mul__')
  824.     testbinop(spamlist([
  825.         1,
  826.         2]), 3, spamlist([
  827.         1,
  828.         2,
  829.         1,
  830.         2,
  831.         1,
  832.         2]), 'b*a', '__rmul__')
  833.     testset2op(spamlist([
  834.         1,
  835.         2]), 1, 3, spamlist([
  836.         1,
  837.         3]), 'a[b]=c', '__setitem__')
  838.     testset3op(spamlist([
  839.         1,
  840.         2,
  841.         3,
  842.         4]), 1, 3, spamlist([
  843.         5,
  844.         6]), spamlist([
  845.         1,
  846.         5,
  847.         6,
  848.         4]), 'a[b:c]=d', '__setslice__')
  849.     
  850.     class C(spam.spamlist):
  851.         
  852.         def foo(self):
  853.             return 1
  854.  
  855.  
  856.     a = C()
  857.     vereq(a, [])
  858.     vereq(a.foo(), 1)
  859.     a.append(100)
  860.     vereq(a, [
  861.         100])
  862.     vereq(a.getstate(), 0)
  863.     a.setstate(42)
  864.     vereq(a.getstate(), 42)
  865.  
  866.  
  867. def spamdicts():
  868.     if verbose:
  869.         print 'Testing spamdict operations...'
  870.     
  871.     import copy
  872.     import xxsubtype as spam
  873.     
  874.     def spamdict(d, memo = None):
  875.         import xxsubtype as spam
  876.         sd = spam.spamdict()
  877.         for k, v in d.items():
  878.             sd[k] = v
  879.         
  880.         return sd
  881.  
  882.     copy._deepcopy_dispatch[spam.spamdict] = spamdict
  883.     testbinop(spamdict({
  884.         1: 2 }), spamdict({
  885.         2: 1 }), -1, 'cmp(a,b)', '__cmp__')
  886.     testbinop(spamdict({
  887.         1: 2,
  888.         3: 4 }), 1, 1, 'b in a', '__contains__')
  889.     testbinop(spamdict({
  890.         1: 2,
  891.         3: 4 }), 2, 0, 'b in a', '__contains__')
  892.     testbinop(spamdict({
  893.         1: 2,
  894.         3: 4 }), 1, 2, 'a[b]', '__getitem__')
  895.     d = spamdict({
  896.         1: 2,
  897.         3: 4 })
  898.     l1 = []
  899.     for i in d.keys():
  900.         l1.append(i)
  901.     
  902.     l = []
  903.     for i in iter(d):
  904.         l.append(i)
  905.     
  906.     vereq(l, l1)
  907.     l = []
  908.     for i in d.__iter__():
  909.         l.append(i)
  910.     
  911.     vereq(l, l1)
  912.     l = []
  913.     for i in type(spamdict({ })).__iter__(d):
  914.         l.append(i)
  915.     
  916.     vereq(l, l1)
  917.     straightd = {
  918.         1: 2,
  919.         3: 4 }
  920.     spamd = spamdict(straightd)
  921.     testunop(spamd, 2, 'len(a)', '__len__')
  922.     testunop(spamd, repr(straightd), 'repr(a)', '__repr__')
  923.     testset2op(spamdict({
  924.         1: 2,
  925.         3: 4 }), 2, 3, spamdict({
  926.         1: 2,
  927.         2: 3,
  928.         3: 4 }), 'a[b]=c', '__setitem__')
  929.     
  930.     class C(spam.spamdict):
  931.         
  932.         def foo(self):
  933.             return 1
  934.  
  935.  
  936.     a = C()
  937.     vereq(a.items(), [])
  938.     vereq(a.foo(), 1)
  939.     a['foo'] = 'bar'
  940.     vereq(a.items(), [
  941.         ('foo', 'bar')])
  942.     vereq(a.getstate(), 0)
  943.     a.setstate(100)
  944.     vereq(a.getstate(), 100)
  945.  
  946.  
  947. def pydicts():
  948.     if verbose:
  949.         print 'Testing Python subclass of dict...'
  950.     
  951.     verify(issubclass(dict, dict))
  952.     verify(isinstance({ }, dict))
  953.     d = dict()
  954.     vereq(d, { })
  955.     verify(d.__class__ is dict)
  956.     verify(isinstance(d, dict))
  957.     
  958.     class C(dict):
  959.         state = -1
  960.         
  961.         def __init__(self, *a, **kw):
  962.             if a:
  963.                 vereq(len(a), 1)
  964.                 self.state = a[0]
  965.             
  966.             if kw:
  967.                 for k, v in kw.items():
  968.                     self[v] = k
  969.                 
  970.             
  971.  
  972.         
  973.         def __getitem__(self, key):
  974.             return self.get(key, 0)
  975.  
  976.         
  977.         def __setitem__(self, key, value):
  978.             verify(isinstance(key, type(0)))
  979.             dict.__setitem__(self, key, value)
  980.  
  981.         
  982.         def setstate(self, state):
  983.             self.state = state
  984.  
  985.         
  986.         def getstate(self):
  987.             return self.state
  988.  
  989.  
  990.     verify(issubclass(C, dict))
  991.     a1 = C(12)
  992.     vereq(a1.state, 12)
  993.     a2 = C(foo = 1, bar = 2)
  994.     if a2[1] == 'foo':
  995.         pass
  996.     vereq(a2[2], 'bar')
  997.     a = C()
  998.     vereq(a.state, -1)
  999.     vereq(a.getstate(), -1)
  1000.     a.setstate(0)
  1001.     vereq(a.state, 0)
  1002.     vereq(a.getstate(), 0)
  1003.     a.setstate(10)
  1004.     vereq(a.state, 10)
  1005.     vereq(a.getstate(), 10)
  1006.     vereq(a[42], 0)
  1007.     a[42] = 24
  1008.     vereq(a[42], 24)
  1009.     if verbose:
  1010.         print 'pydict stress test ...'
  1011.     
  1012.     N = 50
  1013.     for i in range(N):
  1014.         a[i] = C()
  1015.         for j in range(N):
  1016.             a[i][j] = i * j
  1017.         
  1018.     
  1019.     for i in range(N):
  1020.         for j in range(N):
  1021.             vereq(a[i][j], i * j)
  1022.         
  1023.     
  1024.  
  1025.  
  1026. def pylists():
  1027.     if verbose:
  1028.         print 'Testing Python subclass of list...'
  1029.     
  1030.     
  1031.     class C(list):
  1032.         
  1033.         def __getitem__(self, i):
  1034.             return list.__getitem__(self, i) + 100
  1035.  
  1036.         
  1037.         def __getslice__(self, i, j):
  1038.             return (i, j)
  1039.  
  1040.  
  1041.     a = C()
  1042.     a.extend([
  1043.         0,
  1044.         1,
  1045.         2])
  1046.     vereq(a[0], 100)
  1047.     vereq(a[1], 101)
  1048.     vereq(a[2], 102)
  1049.     vereq(a[100:200], (100, 200))
  1050.  
  1051.  
  1052. def metaclass():
  1053.     if verbose:
  1054.         print 'Testing __metaclass__...'
  1055.     
  1056.     
  1057.     class C:
  1058.         __metaclass__ = type
  1059.         
  1060.         def __init__(self):
  1061.             self._C__state = 0
  1062.  
  1063.         
  1064.         def getstate(self):
  1065.             return self._C__state
  1066.  
  1067.         
  1068.         def setstate(self, state):
  1069.             self._C__state = state
  1070.  
  1071.  
  1072.     a = C()
  1073.     vereq(a.getstate(), 0)
  1074.     a.setstate(10)
  1075.     vereq(a.getstate(), 10)
  1076.     
  1077.     class D:
  1078.         
  1079.         class __metaclass__(type):
  1080.             
  1081.             def myself(cls):
  1082.                 return cls
  1083.  
  1084.  
  1085.  
  1086.     vereq(D.myself(), D)
  1087.     d = D()
  1088.     verify(d.__class__ is D)
  1089.     
  1090.     class M1(type):
  1091.         
  1092.         def __new__(cls, name, bases, dict):
  1093.             dict['__spam__'] = 1
  1094.             return type.__new__(cls, name, bases, dict)
  1095.  
  1096.  
  1097.     
  1098.     class C:
  1099.         __metaclass__ = M1
  1100.  
  1101.     vereq(C.__spam__, 1)
  1102.     c = C()
  1103.     vereq(c.__spam__, 1)
  1104.     
  1105.     class _instance(object):
  1106.         pass
  1107.  
  1108.     
  1109.     class M2(object):
  1110.         
  1111.         def __new__(cls, name, bases, dict):
  1112.             self = object.__new__(cls)
  1113.             self.name = name
  1114.             self.bases = bases
  1115.             self.dict = dict
  1116.             return self
  1117.  
  1118.         __new__ = staticmethod(__new__)
  1119.         
  1120.         def __call__(self):
  1121.             it = _instance()
  1122.             for key in self.dict:
  1123.                 if key.startswith('__'):
  1124.                     continue
  1125.                 
  1126.                 setattr(it, key, self.dict[key].__get__(it, self))
  1127.             
  1128.             return it
  1129.  
  1130.  
  1131.     
  1132.     class C:
  1133.         __metaclass__ = M2
  1134.         
  1135.         def spam(self):
  1136.             return 42
  1137.  
  1138.  
  1139.     vereq(C.name, 'C')
  1140.     vereq(C.bases, ())
  1141.     verify('spam' in C.dict)
  1142.     c = C()
  1143.     vereq(c.spam(), 42)
  1144.     
  1145.     class autosuper(type):
  1146.         
  1147.         def __new__(metaclass, name, bases, dict):
  1148.             cls = super(autosuper, metaclass).__new__(metaclass, name, bases, dict)
  1149.             while name[:1] == '_':
  1150.                 name = name[1:]
  1151.             if name:
  1152.                 name = '_%s__super' % name
  1153.             else:
  1154.                 name = '__super'
  1155.             setattr(cls, name, super(cls))
  1156.             return cls
  1157.  
  1158.  
  1159.     
  1160.     class A:
  1161.         __metaclass__ = autosuper
  1162.         
  1163.         def meth(self):
  1164.             return 'A'
  1165.  
  1166.  
  1167.     
  1168.     class B(A):
  1169.         
  1170.         def meth(self):
  1171.             return 'B' + self._B__super.meth()
  1172.  
  1173.  
  1174.     
  1175.     class C(A):
  1176.         
  1177.         def meth(self):
  1178.             return 'C' + self._C__super.meth()
  1179.  
  1180.  
  1181.     
  1182.     class D(C, B):
  1183.         
  1184.         def meth(self):
  1185.             return 'D' + self._D__super.meth()
  1186.  
  1187.  
  1188.     vereq(D().meth(), 'DCBA')
  1189.     
  1190.     class E(B, C):
  1191.         
  1192.         def meth(self):
  1193.             return 'E' + self._E__super.meth()
  1194.  
  1195.  
  1196.     vereq(E().meth(), 'EBCA')
  1197.     
  1198.     class autoproperty(type):
  1199.         
  1200.         def __new__(metaclass, name, bases, dict):
  1201.             hits = { }
  1202.             for key, val in dict.iteritems():
  1203.                 if key.startswith('_get_'):
  1204.                     key = key[5:]
  1205.                     (get, set) = hits.get(key, (None, None))
  1206.                     get = val
  1207.                     hits[key] = (get, set)
  1208.                     continue
  1209.                 if key.startswith('_set_'):
  1210.                     key = key[5:]
  1211.                     (get, set) = hits.get(key, (None, None))
  1212.                     set = val
  1213.                     hits[key] = (get, set)
  1214.                     continue
  1215.             
  1216.             for get, set in hits.iteritems():
  1217.                 dict[key] = property(get, set)
  1218.             
  1219.             return super(autoproperty, metaclass).__new__(metaclass, name, bases, dict)
  1220.  
  1221.  
  1222.     
  1223.     class A:
  1224.         __metaclass__ = autoproperty
  1225.         
  1226.         def _get_x(self):
  1227.             return -(self._A__x)
  1228.  
  1229.         
  1230.         def _set_x(self, x):
  1231.             self._A__x = -x
  1232.  
  1233.  
  1234.     a = A()
  1235.     verify(not hasattr(a, 'x'))
  1236.     a.x = 12
  1237.     vereq(a.x, 12)
  1238.     vereq(a._A__x, -12)
  1239.     
  1240.     class multimetaclass(autoproperty, autosuper):
  1241.         pass
  1242.  
  1243.     
  1244.     class A:
  1245.         __metaclass__ = multimetaclass
  1246.         
  1247.         def _get_x(self):
  1248.             return 'A'
  1249.  
  1250.  
  1251.     
  1252.     class B(A):
  1253.         
  1254.         def _get_x(self):
  1255.             return 'B' + self._B__super._get_x()
  1256.  
  1257.  
  1258.     
  1259.     class C(A):
  1260.         
  1261.         def _get_x(self):
  1262.             return 'C' + self._C__super._get_x()
  1263.  
  1264.  
  1265.     
  1266.     class D(C, B):
  1267.         
  1268.         def _get_x(self):
  1269.             return 'D' + self._D__super._get_x()
  1270.  
  1271.  
  1272.     vereq(D().x, 'DCBA')
  1273.     
  1274.     class T(type):
  1275.         counter = 0
  1276.         
  1277.         def __init__(self, *args):
  1278.             T.counter += 1
  1279.  
  1280.  
  1281.     
  1282.     class C:
  1283.         __metaclass__ = T
  1284.  
  1285.     vereq(T.counter, 1)
  1286.     a = C()
  1287.     vereq(type(a), C)
  1288.     vereq(T.counter, 1)
  1289.     
  1290.     class C(object):
  1291.         pass
  1292.  
  1293.     c = C()
  1294.     
  1295.     try:
  1296.         c()
  1297.     except TypeError:
  1298.         pass
  1299.  
  1300.     raise TestFailed, 'calling object w/o call method should raise TypeError'
  1301.  
  1302.  
  1303. def pymods():
  1304.     if verbose:
  1305.         print 'Testing Python subclass of module...'
  1306.     
  1307.     log = []
  1308.     import sys
  1309.     MT = type(sys)
  1310.     
  1311.     class MM(MT):
  1312.         
  1313.         def __init__(self, name):
  1314.             MT.__init__(self, name)
  1315.  
  1316.         
  1317.         def __getattribute__(self, name):
  1318.             log.append(('getattr', name))
  1319.             return MT.__getattribute__(self, name)
  1320.  
  1321.         
  1322.         def __setattr__(self, name, value):
  1323.             log.append(('setattr', name, value))
  1324.             MT.__setattr__(self, name, value)
  1325.  
  1326.         
  1327.         def __delattr__(self, name):
  1328.             log.append(('delattr', name))
  1329.             MT.__delattr__(self, name)
  1330.  
  1331.  
  1332.     a = MM('a')
  1333.     a.foo = 12
  1334.     x = a.foo
  1335.     del a.foo
  1336.     vereq(log, [
  1337.         ('setattr', 'foo', 12),
  1338.         ('getattr', 'foo'),
  1339.         ('delattr', 'foo')])
  1340.  
  1341.  
  1342. def multi():
  1343.     if verbose:
  1344.         print 'Testing multiple inheritance...'
  1345.     
  1346.     
  1347.     class C(object):
  1348.         
  1349.         def __init__(self):
  1350.             self._C__state = 0
  1351.  
  1352.         
  1353.         def getstate(self):
  1354.             return self._C__state
  1355.  
  1356.         
  1357.         def setstate(self, state):
  1358.             self._C__state = state
  1359.  
  1360.  
  1361.     a = C()
  1362.     vereq(a.getstate(), 0)
  1363.     a.setstate(10)
  1364.     vereq(a.getstate(), 10)
  1365.     
  1366.     class D(dict, C):
  1367.         
  1368.         def __init__(self):
  1369.             type({ }).__init__(self)
  1370.             C.__init__(self)
  1371.  
  1372.  
  1373.     d = D()
  1374.     vereq(d.keys(), [])
  1375.     d['hello'] = 'world'
  1376.     vereq(d.items(), [
  1377.         ('hello', 'world')])
  1378.     vereq(d['hello'], 'world')
  1379.     vereq(d.getstate(), 0)
  1380.     d.setstate(10)
  1381.     vereq(d.getstate(), 10)
  1382.     vereq(D.__mro__, (D, dict, C, object))
  1383.     
  1384.     class Node(object):
  1385.         
  1386.         def __int__(self):
  1387.             return int(self.foo())
  1388.  
  1389.         
  1390.         def foo(self):
  1391.             return '23'
  1392.  
  1393.  
  1394.     
  1395.     class Frag(Node, list):
  1396.         
  1397.         def foo(self):
  1398.             return '42'
  1399.  
  1400.  
  1401.     vereq(Node().__int__(), 23)
  1402.     vereq(int(Node()), 23)
  1403.     vereq(Frag().__int__(), 42)
  1404.     vereq(int(Frag()), 42)
  1405.     
  1406.     class A:
  1407.         x = 1
  1408.  
  1409.     
  1410.     class B(A):
  1411.         pass
  1412.  
  1413.     
  1414.     class C(A):
  1415.         x = 2
  1416.  
  1417.     
  1418.     class D(B, C):
  1419.         pass
  1420.  
  1421.     vereq(D.x, 1)
  1422.     
  1423.     class E(D, object):
  1424.         pass
  1425.  
  1426.     vereq(E.__mro__, (E, D, B, A, C, object))
  1427.     vereq(E.x, 1)
  1428.     
  1429.     class F(B, C, object):
  1430.         pass
  1431.  
  1432.     vereq(F.__mro__, (F, B, C, A, object))
  1433.     vereq(F.x, 2)
  1434.     
  1435.     class C:
  1436.         
  1437.         def cmethod(self):
  1438.             return 'C a'
  1439.  
  1440.         
  1441.         def all_method(self):
  1442.             return 'C b'
  1443.  
  1444.  
  1445.     
  1446.     class M1(C, object):
  1447.         
  1448.         def m1method(self):
  1449.             return 'M1 a'
  1450.  
  1451.         
  1452.         def all_method(self):
  1453.             return 'M1 b'
  1454.  
  1455.  
  1456.     vereq(M1.__mro__, (M1, C, object))
  1457.     m = M1()
  1458.     vereq(m.cmethod(), 'C a')
  1459.     vereq(m.m1method(), 'M1 a')
  1460.     vereq(m.all_method(), 'M1 b')
  1461.     
  1462.     class D(C):
  1463.         
  1464.         def dmethod(self):
  1465.             return 'D a'
  1466.  
  1467.         
  1468.         def all_method(self):
  1469.             return 'D b'
  1470.  
  1471.  
  1472.     
  1473.     class M2(D, object):
  1474.         
  1475.         def m2method(self):
  1476.             return 'M2 a'
  1477.  
  1478.         
  1479.         def all_method(self):
  1480.             return 'M2 b'
  1481.  
  1482.  
  1483.     vereq(M2.__mro__, (M2, D, C, object))
  1484.     m = M2()
  1485.     vereq(m.cmethod(), 'C a')
  1486.     vereq(m.dmethod(), 'D a')
  1487.     vereq(m.m2method(), 'M2 a')
  1488.     vereq(m.all_method(), 'M2 b')
  1489.     
  1490.     class M3(M1, M2, object):
  1491.         
  1492.         def m3method(self):
  1493.             return 'M3 a'
  1494.  
  1495.         
  1496.         def all_method(self):
  1497.             return 'M3 b'
  1498.  
  1499.  
  1500.     vereq(M3.__mro__, (M3, M1, M2, D, C, object))
  1501.     m = M3()
  1502.     vereq(m.cmethod(), 'C a')
  1503.     vereq(m.dmethod(), 'D a')
  1504.     vereq(m.m1method(), 'M1 a')
  1505.     vereq(m.m2method(), 'M2 a')
  1506.     vereq(m.m3method(), 'M3 a')
  1507.     vereq(m.all_method(), 'M3 b')
  1508.     
  1509.     class Classic:
  1510.         pass
  1511.  
  1512.     
  1513.     try:
  1514.         
  1515.         class New(Classic):
  1516.             __metaclass__ = type
  1517.  
  1518.     except TypeError:
  1519.         pass
  1520.  
  1521.     raise TestFailed, "new class with only classic bases - shouldn't be"
  1522.  
  1523.  
  1524. def diamond():
  1525.     if verbose:
  1526.         print 'Testing multiple inheritance special cases...'
  1527.     
  1528.     
  1529.     class A(object):
  1530.         
  1531.         def spam(self):
  1532.             return 'A'
  1533.  
  1534.  
  1535.     vereq(A().spam(), 'A')
  1536.     
  1537.     class B(A):
  1538.         
  1539.         def boo(self):
  1540.             return 'B'
  1541.  
  1542.         
  1543.         def spam(self):
  1544.             return 'B'
  1545.  
  1546.  
  1547.     vereq(B().spam(), 'B')
  1548.     vereq(B().boo(), 'B')
  1549.     
  1550.     class C(A):
  1551.         
  1552.         def boo(self):
  1553.             return 'C'
  1554.  
  1555.  
  1556.     vereq(C().spam(), 'A')
  1557.     vereq(C().boo(), 'C')
  1558.     
  1559.     class D(B, C):
  1560.         pass
  1561.  
  1562.     vereq(D().spam(), 'B')
  1563.     vereq(D().boo(), 'B')
  1564.     vereq(D.__mro__, (D, B, C, A, object))
  1565.     
  1566.     class E(C, B):
  1567.         pass
  1568.  
  1569.     vereq(E().spam(), 'B')
  1570.     vereq(E().boo(), 'C')
  1571.     vereq(E.__mro__, (E, C, B, A, object))
  1572.     
  1573.     try:
  1574.         
  1575.         class F(D, E):
  1576.             pass
  1577.  
  1578.     except TypeError:
  1579.         pass
  1580.  
  1581.     raise TestFailed, 'expected MRO order disagreement (F)'
  1582.     
  1583.     try:
  1584.         
  1585.         class G(E, D):
  1586.             pass
  1587.  
  1588.     except TypeError:
  1589.         pass
  1590.  
  1591.     raise TestFailed, 'expected MRO order disagreement (G)'
  1592.  
  1593.  
  1594. def ex5():
  1595.     if verbose:
  1596.         print 'Testing ex5 from C3 switch discussion...'
  1597.     
  1598.     
  1599.     class A(object):
  1600.         pass
  1601.  
  1602.     
  1603.     class B(object):
  1604.         pass
  1605.  
  1606.     
  1607.     class C(object):
  1608.         pass
  1609.  
  1610.     
  1611.     class X(A):
  1612.         pass
  1613.  
  1614.     
  1615.     class Y(A):
  1616.         pass
  1617.  
  1618.     
  1619.     class Z(X, B, Y, C):
  1620.         pass
  1621.  
  1622.     vereq(Z.__mro__, (Z, X, B, Y, A, C, object))
  1623.  
  1624.  
  1625. def monotonicity():
  1626.     if verbose:
  1627.         print 'Testing MRO monotonicity...'
  1628.     
  1629.     
  1630.     class Boat(object):
  1631.         pass
  1632.  
  1633.     
  1634.     class DayBoat(Boat):
  1635.         pass
  1636.  
  1637.     
  1638.     class WheelBoat(Boat):
  1639.         pass
  1640.  
  1641.     
  1642.     class EngineLess(DayBoat):
  1643.         pass
  1644.  
  1645.     
  1646.     class SmallMultihull(DayBoat):
  1647.         pass
  1648.  
  1649.     
  1650.     class PedalWheelBoat(EngineLess, WheelBoat):
  1651.         pass
  1652.  
  1653.     
  1654.     class SmallCatamaran(SmallMultihull):
  1655.         pass
  1656.  
  1657.     
  1658.     class Pedalo(PedalWheelBoat, SmallCatamaran):
  1659.         pass
  1660.  
  1661.     vereq(PedalWheelBoat.__mro__, (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat, object))
  1662.     vereq(SmallCatamaran.__mro__, (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
  1663.     vereq(Pedalo.__mro__, (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran, SmallMultihull, DayBoat, WheelBoat, Boat, object))
  1664.  
  1665.  
  1666. def consistency_with_epg():
  1667.     if verbose:
  1668.         print 'Testing consistentcy with EPG...'
  1669.     
  1670.     
  1671.     class Pane(object):
  1672.         pass
  1673.  
  1674.     
  1675.     class ScrollingMixin(object):
  1676.         pass
  1677.  
  1678.     
  1679.     class EditingMixin(object):
  1680.         pass
  1681.  
  1682.     
  1683.     class ScrollablePane(Pane, ScrollingMixin):
  1684.         pass
  1685.  
  1686.     
  1687.     class EditablePane(Pane, EditingMixin):
  1688.         pass
  1689.  
  1690.     
  1691.     class EditableScrollablePane(ScrollablePane, EditablePane):
  1692.         pass
  1693.  
  1694.     vereq(EditableScrollablePane.__mro__, (EditableScrollablePane, ScrollablePane, EditablePane, Pane, ScrollingMixin, EditingMixin, object))
  1695.  
  1696. mro_err_msg = 'Cannot create a consistent method resolution\norder (MRO) for bases '
  1697.  
  1698. def mro_disagreement():
  1699.     if verbose:
  1700.         print 'Testing error messages for MRO disagreement...'
  1701.     
  1702.     
  1703.     def raises(exc, expected, callable, *args):
  1704.         
  1705.         try:
  1706.             callable(*args)
  1707.         except exc:
  1708.             msg = None
  1709.             if not str(msg).startswith(expected):
  1710.                 raise TestFailed, 'Message %r, expected %r' % (str(msg), expected)
  1711.             
  1712.         except:
  1713.             str(msg).startswith(expected)
  1714.  
  1715.         raise TestFailed, 'Expected %s' % exc
  1716.  
  1717.     
  1718.     class A(object):
  1719.         pass
  1720.  
  1721.     
  1722.     class B(A):
  1723.         pass
  1724.  
  1725.     
  1726.     class C(object):
  1727.         pass
  1728.  
  1729.     raises(TypeError, 'duplicate base class A', type, 'X', (A, A), { })
  1730.     raises(TypeError, mro_err_msg, type, 'X', (A, B), { })
  1731.     raises(TypeError, mro_err_msg, type, 'X', (A, C, B), { })
  1732.     
  1733.     class GridLayout(object):
  1734.         pass
  1735.  
  1736.     
  1737.     class HorizontalGrid(GridLayout):
  1738.         pass
  1739.  
  1740.     
  1741.     class VerticalGrid(GridLayout):
  1742.         pass
  1743.  
  1744.     
  1745.     class HVGrid(HorizontalGrid, VerticalGrid):
  1746.         pass
  1747.  
  1748.     
  1749.     class VHGrid(VerticalGrid, HorizontalGrid):
  1750.         pass
  1751.  
  1752.     raises(TypeError, mro_err_msg, type, 'ConfusedGrid', (HVGrid, VHGrid), { })
  1753.  
  1754.  
  1755. def objects():
  1756.     if verbose:
  1757.         print 'Testing object class...'
  1758.     
  1759.     a = object()
  1760.     vereq(a.__class__, object)
  1761.     vereq(type(a), object)
  1762.     b = object()
  1763.     verify(a is not b)
  1764.     verify(not hasattr(a, 'foo'))
  1765.     
  1766.     try:
  1767.         a.foo = 12
  1768.     except (AttributeError, TypeError):
  1769.         pass
  1770.  
  1771.     verify(0, 'object() should not allow setting a foo attribute')
  1772.     verify(not hasattr(object(), '__dict__'))
  1773.     
  1774.     class Cdict(object):
  1775.         pass
  1776.  
  1777.     x = Cdict()
  1778.     vereq(x.__dict__, { })
  1779.     x.foo = 1
  1780.     vereq(x.foo, 1)
  1781.     vereq(x.__dict__, {
  1782.         'foo': 1 })
  1783.  
  1784.  
  1785. def slots():
  1786.     if verbose:
  1787.         print 'Testing __slots__...'
  1788.     
  1789.     
  1790.     class C0(object):
  1791.         __slots__ = []
  1792.  
  1793.     x = C0()
  1794.     verify(not hasattr(x, '__dict__'))
  1795.     verify(not hasattr(x, 'foo'))
  1796.     
  1797.     class C1(object):
  1798.         __slots__ = [
  1799.             'a']
  1800.  
  1801.     x = C1()
  1802.     verify(not hasattr(x, '__dict__'))
  1803.     verify(not hasattr(x, 'a'))
  1804.     x.a = 1
  1805.     vereq(x.a, 1)
  1806.     x.a = None
  1807.     veris(x.a, None)
  1808.     del x.a
  1809.     verify(not hasattr(x, 'a'))
  1810.     
  1811.     class C3(object):
  1812.         __slots__ = [
  1813.             'a',
  1814.             'b',
  1815.             'c']
  1816.  
  1817.     x = C3()
  1818.     verify(not hasattr(x, '__dict__'))
  1819.     verify(not hasattr(x, 'a'))
  1820.     verify(not hasattr(x, 'b'))
  1821.     verify(not hasattr(x, 'c'))
  1822.     x.a = 1
  1823.     x.b = 2
  1824.     x.c = 3
  1825.     vereq(x.a, 1)
  1826.     vereq(x.b, 2)
  1827.     vereq(x.c, 3)
  1828.     
  1829.     class C4(object):
  1830.         '''Validate name mangling'''
  1831.         __slots__ = [
  1832.             '__a']
  1833.         
  1834.         def __init__(self, value):
  1835.             self._C4__a = value
  1836.  
  1837.         
  1838.         def get(self):
  1839.             return self._C4__a
  1840.  
  1841.  
  1842.     x = C4(5)
  1843.     verify(not hasattr(x, '__dict__'))
  1844.     verify(not hasattr(x, '__a'))
  1845.     vereq(x.get(), 5)
  1846.     
  1847.     try:
  1848.         x.__a = 6
  1849.     except AttributeError:
  1850.         pass
  1851.  
  1852.     raise TestFailed, 'Double underscored names not mangled'
  1853.     
  1854.     try:
  1855.         
  1856.         class C(object):
  1857.             __slots__ = [
  1858.                 None]
  1859.  
  1860.     except TypeError:
  1861.         pass
  1862.  
  1863.     raise TestFailed, '[None] slots not caught'
  1864.     
  1865.     try:
  1866.         
  1867.         class C(object):
  1868.             __slots__ = [
  1869.                 'foo bar']
  1870.  
  1871.     except TypeError:
  1872.         pass
  1873.  
  1874.     raise TestFailed, "['foo bar'] slots not caught"
  1875.     
  1876.     try:
  1877.         
  1878.         class C(object):
  1879.             __slots__ = [
  1880.                 'foo\x00bar']
  1881.  
  1882.     except TypeError:
  1883.         pass
  1884.  
  1885.     raise TestFailed, "['foo\\0bar'] slots not caught"
  1886.     
  1887.     try:
  1888.         
  1889.         class C(object):
  1890.             __slots__ = [
  1891.                 '1']
  1892.  
  1893.     except TypeError:
  1894.         pass
  1895.  
  1896.     raise TestFailed, "['1'] slots not caught"
  1897.     
  1898.     try:
  1899.         
  1900.         class C(object):
  1901.             __slots__ = [
  1902.                 '']
  1903.  
  1904.     except TypeError:
  1905.         pass
  1906.  
  1907.     raise TestFailed, "[''] slots not caught"
  1908.     
  1909.     class C(object):
  1910.         __slots__ = [
  1911.             'a',
  1912.             'a_b',
  1913.             '_a',
  1914.             'A0123456789Z']
  1915.  
  1916.     
  1917.     class Counted(object):
  1918.         counter = 0
  1919.         
  1920.         def __init__(self):
  1921.             Counted.counter += 1
  1922.  
  1923.         
  1924.         def __del__(self):
  1925.             Counted.counter -= 1
  1926.  
  1927.  
  1928.     
  1929.     class C(object):
  1930.         __slots__ = [
  1931.             'a',
  1932.             'b',
  1933.             'c']
  1934.  
  1935.     x = C()
  1936.     x.a = Counted()
  1937.     x.b = Counted()
  1938.     x.c = Counted()
  1939.     vereq(Counted.counter, 3)
  1940.     del x
  1941.     vereq(Counted.counter, 0)
  1942.     
  1943.     class D(C):
  1944.         pass
  1945.  
  1946.     x = D()
  1947.     x.a = Counted()
  1948.     x.z = Counted()
  1949.     vereq(Counted.counter, 2)
  1950.     del x
  1951.     vereq(Counted.counter, 0)
  1952.     
  1953.     class E(D):
  1954.         __slots__ = [
  1955.             'e']
  1956.  
  1957.     x = E()
  1958.     x.a = Counted()
  1959.     x.z = Counted()
  1960.     x.e = Counted()
  1961.     vereq(Counted.counter, 3)
  1962.     del x
  1963.     vereq(Counted.counter, 0)
  1964.     
  1965.     class F(object):
  1966.         __slots__ = [
  1967.             'a',
  1968.             'b']
  1969.  
  1970.     log = []
  1971.     s = F()
  1972.     s.a = [
  1973.         Counted(),
  1974.         s]
  1975.     vereq(Counted.counter, 1)
  1976.     s = None
  1977.     import gc as gc
  1978.     gc.collect()
  1979.     vereq(Counted.counter, 0)
  1980.     import sys
  1981.     import gc as gc
  1982.     
  1983.     class G(object):
  1984.         
  1985.         def __cmp__(self, other):
  1986.             return 0
  1987.  
  1988.  
  1989.     g = G()
  1990.     orig_objects = len(gc.get_objects())
  1991.     for i in xrange(10):
  1992.         g == g
  1993.     
  1994.     new_objects = len(gc.get_objects())
  1995.     vereq(orig_objects, new_objects)
  1996.     
  1997.     class H(object):
  1998.         __slots__ = [
  1999.             'a',
  2000.             'b']
  2001.         
  2002.         def __init__(self):
  2003.             self.a = 1
  2004.             self.b = 2
  2005.  
  2006.         
  2007.         def __del__(self):
  2008.             if not self.a == 1:
  2009.                 raise AssertionError
  2010.             if not self.b == 2:
  2011.                 raise AssertionError
  2012.  
  2013.  
  2014.     save_stderr = sys.stderr
  2015.     sys.stderr = sys.stdout
  2016.     h = H()
  2017.     
  2018.     try:
  2019.         del h
  2020.     finally:
  2021.         sys.stderr = save_stderr
  2022.  
  2023.  
  2024.  
  2025. def slotspecials():
  2026.     if verbose:
  2027.         print 'Testing __dict__ and __weakref__ in __slots__...'
  2028.     
  2029.     
  2030.     class D(object):
  2031.         __slots__ = [
  2032.             '__dict__']
  2033.  
  2034.     a = D()
  2035.     verify(hasattr(a, '__dict__'))
  2036.     verify(not hasattr(a, '__weakref__'))
  2037.     a.foo = 42
  2038.     vereq(a.__dict__, {
  2039.         'foo': 42 })
  2040.     
  2041.     class W(object):
  2042.         __slots__ = [
  2043.             '__weakref__']
  2044.  
  2045.     a = W()
  2046.     verify(hasattr(a, '__weakref__'))
  2047.     verify(not hasattr(a, '__dict__'))
  2048.     
  2049.     try:
  2050.         a.foo = 42
  2051.     except AttributeError:
  2052.         pass
  2053.  
  2054.     raise TestFailed, "shouldn't be allowed to set a.foo"
  2055.     
  2056.     class C1(W, D):
  2057.         __slots__ = []
  2058.  
  2059.     a = C1()
  2060.     verify(hasattr(a, '__dict__'))
  2061.     verify(hasattr(a, '__weakref__'))
  2062.     a.foo = 42
  2063.     vereq(a.__dict__, {
  2064.         'foo': 42 })
  2065.     
  2066.     class C2(D, W):
  2067.         __slots__ = []
  2068.  
  2069.     a = C2()
  2070.     verify(hasattr(a, '__dict__'))
  2071.     verify(hasattr(a, '__weakref__'))
  2072.     a.foo = 42
  2073.     vereq(a.__dict__, {
  2074.         'foo': 42 })
  2075.  
  2076.  
  2077. def dynamics():
  2078.     if verbose:
  2079.         print 'Testing class attribute propagation...'
  2080.     
  2081.     
  2082.     class D(object):
  2083.         pass
  2084.  
  2085.     
  2086.     class E(D):
  2087.         pass
  2088.  
  2089.     
  2090.     class F(D):
  2091.         pass
  2092.  
  2093.     D.foo = 1
  2094.     vereq(D.foo, 1)
  2095.     vereq(E.foo, 1)
  2096.     vereq(F.foo, 1)
  2097.     
  2098.     class C(object):
  2099.         pass
  2100.  
  2101.     a = C()
  2102.     verify(not hasattr(a, 'foobar'))
  2103.     C.foobar = 2
  2104.     vereq(a.foobar, 2)
  2105.     
  2106.     C.method = lambda self: 42
  2107.     vereq(a.method(), 42)
  2108.     
  2109.     C.__repr__ = lambda self: 'C()'
  2110.     vereq(repr(a), 'C()')
  2111.     
  2112.     C.__int__ = lambda self: 100
  2113.     vereq(int(a), 100)
  2114.     vereq(a.foobar, 2)
  2115.     verify(not hasattr(a, 'spam'))
  2116.     
  2117.     def mygetattr(self, name):
  2118.         if name == 'spam':
  2119.             return 'spam'
  2120.         
  2121.         raise AttributeError
  2122.  
  2123.     C.__getattr__ = mygetattr
  2124.     vereq(a.spam, 'spam')
  2125.     a.new = 12
  2126.     vereq(a.new, 12)
  2127.     
  2128.     def mysetattr(self, name, value):
  2129.         if name == 'spam':
  2130.             raise AttributeError
  2131.         
  2132.         return object.__setattr__(self, name, value)
  2133.  
  2134.     C.__setattr__ = mysetattr
  2135.     
  2136.     try:
  2137.         a.spam = 'not spam'
  2138.     except AttributeError:
  2139.         pass
  2140.  
  2141.     verify(0, 'expected AttributeError')
  2142.     vereq(a.spam, 'spam')
  2143.     
  2144.     class D(C):
  2145.         pass
  2146.  
  2147.     d = D()
  2148.     d.foo = 1
  2149.     vereq(d.foo, 1)
  2150.     
  2151.     class I(int):
  2152.         pass
  2153.  
  2154.     vereq('a' * I(2), 'aa')
  2155.     vereq(I(2) * 'a', 'aa')
  2156.     vereq(2 * I(3), 6)
  2157.     vereq(I(3) * 2, 6)
  2158.     vereq(I(3) * I(2), 6)
  2159.     
  2160.     class L(long):
  2161.         pass
  2162.  
  2163.     vereq('a' * L(0x2L), 'aa')
  2164.     vereq(L(0x2L) * 'a', 'aa')
  2165.     vereq(2 * L(3), 6)
  2166.     vereq(L(3) * 2, 6)
  2167.     vereq(L(3) * L(2), 6)
  2168.     
  2169.     class dynamicmetaclass(type):
  2170.         pass
  2171.  
  2172.     
  2173.     class someclass:
  2174.         __metaclass__ = dynamicmetaclass
  2175.  
  2176.     verify(someclass != object)
  2177.  
  2178.  
  2179. def errors():
  2180.     if verbose:
  2181.         print 'Testing errors...'
  2182.     
  2183.     
  2184.     try:
  2185.         
  2186.         class C(list, dict):
  2187.             pass
  2188.  
  2189.     except TypeError:
  2190.         pass
  2191.  
  2192.     verify(0, 'inheritance from both list and dict should be illegal')
  2193.     
  2194.     try:
  2195.         
  2196.         class C(object, None):
  2197.             pass
  2198.  
  2199.     except TypeError:
  2200.         pass
  2201.  
  2202.     verify(0, 'inheritance from non-type should be illegal')
  2203.     
  2204.     class Classic:
  2205.         pass
  2206.  
  2207.     
  2208.     try:
  2209.         
  2210.         class C(type(len)):
  2211.             pass
  2212.  
  2213.     except TypeError:
  2214.         pass
  2215.  
  2216.     verify(0, 'inheritance from CFunction should be illegal')
  2217.     
  2218.     try:
  2219.         
  2220.         class C(object):
  2221.             __slots__ = 1
  2222.  
  2223.     except TypeError:
  2224.         pass
  2225.  
  2226.     verify(0, '__slots__ = 1 should be illegal')
  2227.     
  2228.     try:
  2229.         
  2230.         class C(object):
  2231.             __slots__ = [
  2232.                 1]
  2233.  
  2234.     except TypeError:
  2235.         pass
  2236.  
  2237.     verify(0, '__slots__ = [1] should be illegal')
  2238.  
  2239.  
  2240. def classmethods():
  2241.     if verbose:
  2242.         print 'Testing class methods...'
  2243.     
  2244.     
  2245.     class C(object):
  2246.         
  2247.         def foo(*a):
  2248.             return a
  2249.  
  2250.         goo = classmethod(foo)
  2251.  
  2252.     c = C()
  2253.     vereq(C.goo(1), (C, 1))
  2254.     vereq(c.goo(1), (C, 1))
  2255.     vereq(c.foo(1), (c, 1))
  2256.     
  2257.     class D(C):
  2258.         pass
  2259.  
  2260.     d = D()
  2261.     vereq(D.goo(1), (D, 1))
  2262.     vereq(d.goo(1), (D, 1))
  2263.     vereq(d.foo(1), (d, 1))
  2264.     vereq(D.foo(d, 1), (d, 1))
  2265.     
  2266.     def f(cls, arg):
  2267.         return (cls, arg)
  2268.  
  2269.     ff = classmethod(f)
  2270.     vereq(ff.__get__(0, int)(42), (int, 42))
  2271.     vereq(ff.__get__(0)(42), (int, 42))
  2272.     veris(C.goo.im_self, C)
  2273.     veris(D.goo.im_self, D)
  2274.     veris(super(D, D).goo.im_self, D)
  2275.     veris(super(D, d).goo.im_self, D)
  2276.     vereq(super(D, D).goo(), (D,))
  2277.     vereq(super(D, d).goo(), (D,))
  2278.     
  2279.     try:
  2280.         classmethod(1).__get__(1)
  2281.     except TypeError:
  2282.         pass
  2283.  
  2284.     raise TestFailed, 'classmethod should check for callability'
  2285.  
  2286.  
  2287. def classmethods_in_c():
  2288.     if verbose:
  2289.         print 'Testing C-based class methods...'
  2290.     
  2291.     import xxsubtype as spam
  2292.     a = (1, 2, 3)
  2293.     d = {
  2294.         'abc': 123 }
  2295.     (x, a1, d1) = spam.spamlist.classmeth(*a, **d)
  2296.     veris(x, spam.spamlist)
  2297.     vereq(a, a1)
  2298.     vereq(d, d1)
  2299.     (x, a1, d1) = spam.spamlist().classmeth(*a, **d)
  2300.     veris(x, spam.spamlist)
  2301.     vereq(a, a1)
  2302.     vereq(d, d1)
  2303.  
  2304.  
  2305. def staticmethods():
  2306.     if verbose:
  2307.         print 'Testing static methods...'
  2308.     
  2309.     
  2310.     class C(object):
  2311.         
  2312.         def foo(*a):
  2313.             return a
  2314.  
  2315.         goo = staticmethod(foo)
  2316.  
  2317.     c = C()
  2318.     vereq(C.goo(1), (1,))
  2319.     vereq(c.goo(1), (1,))
  2320.     vereq(c.foo(1), (c, 1))
  2321.     
  2322.     class D(C):
  2323.         pass
  2324.  
  2325.     d = D()
  2326.     vereq(D.goo(1), (1,))
  2327.     vereq(d.goo(1), (1,))
  2328.     vereq(d.foo(1), (d, 1))
  2329.     vereq(D.foo(d, 1), (d, 1))
  2330.  
  2331.  
  2332. def staticmethods_in_c():
  2333.     if verbose:
  2334.         print 'Testing C-based static methods...'
  2335.     
  2336.     import xxsubtype as spam
  2337.     a = (1, 2, 3)
  2338.     d = {
  2339.         'abc': 123 }
  2340.     (x, a1, d1) = spam.spamlist.staticmeth(*a, **d)
  2341.     veris(x, None)
  2342.     vereq(a, a1)
  2343.     vereq(d, d1)
  2344.     (x, a1, d2) = spam.spamlist().staticmeth(*a, **d)
  2345.     veris(x, None)
  2346.     vereq(a, a1)
  2347.     vereq(d, d1)
  2348.  
  2349.  
  2350. def classic():
  2351.     if verbose:
  2352.         print 'Testing classic classes...'
  2353.     
  2354.     
  2355.     class C:
  2356.         
  2357.         def foo(*a):
  2358.             return a
  2359.  
  2360.         goo = classmethod(foo)
  2361.  
  2362.     c = C()
  2363.     vereq(C.goo(1), (C, 1))
  2364.     vereq(c.goo(1), (C, 1))
  2365.     vereq(c.foo(1), (c, 1))
  2366.     
  2367.     class D(C):
  2368.         pass
  2369.  
  2370.     d = D()
  2371.     vereq(D.goo(1), (D, 1))
  2372.     vereq(d.goo(1), (D, 1))
  2373.     vereq(d.foo(1), (d, 1))
  2374.     vereq(D.foo(d, 1), (d, 1))
  2375.     
  2376.     class E:
  2377.         foo = C.foo
  2378.  
  2379.     vereq(E().foo, C.foo)
  2380.     verify(repr(C.foo.__get__(C())).startswith('<bound method '))
  2381.  
  2382.  
  2383. def compattr():
  2384.     if verbose:
  2385.         print 'Testing computed attributes...'
  2386.     
  2387.     
  2388.     class C(object):
  2389.         
  2390.         class computed_attribute(object):
  2391.             
  2392.             def __init__(self, get, set = None, delete = None):
  2393.                 self._computed_attribute__get = get
  2394.                 self._computed_attribute__set = set
  2395.                 self._computed_attribute__delete = delete
  2396.  
  2397.             
  2398.             def __get__(self, obj, type = None):
  2399.                 return self._computed_attribute__get(obj)
  2400.  
  2401.             
  2402.             def __set__(self, obj, value):
  2403.                 return self._computed_attribute__set(obj, value)
  2404.  
  2405.             
  2406.             def __delete__(self, obj):
  2407.                 return self._computed_attribute__delete(obj)
  2408.  
  2409.  
  2410.         
  2411.         def __init__(self):
  2412.             self._C__x = 0
  2413.  
  2414.         
  2415.         def __get_x(self):
  2416.             x = self._C__x
  2417.             self._C__x = x + 1
  2418.             return x
  2419.  
  2420.         
  2421.         def __set_x(self, x):
  2422.             self._C__x = x
  2423.  
  2424.         
  2425.         def __delete_x(self):
  2426.             del self._C__x
  2427.  
  2428.         x = computed_attribute(__get_x, __set_x, __delete_x)
  2429.  
  2430.     a = C()
  2431.     vereq(a.x, 0)
  2432.     vereq(a.x, 1)
  2433.     a.x = 10
  2434.     vereq(a.x, 10)
  2435.     vereq(a.x, 11)
  2436.     del a.x
  2437.     vereq(hasattr(a, 'x'), 0)
  2438.  
  2439.  
  2440. def newslot():
  2441.     if verbose:
  2442.         print 'Testing __new__ slot override...'
  2443.     
  2444.     
  2445.     class C(list):
  2446.         
  2447.         def __new__(cls):
  2448.             self = list.__new__(cls)
  2449.             self.foo = 1
  2450.             return self
  2451.  
  2452.         
  2453.         def __init__(self):
  2454.             self.foo = self.foo + 2
  2455.  
  2456.  
  2457.     a = C()
  2458.     vereq(a.foo, 3)
  2459.     verify(a.__class__ is C)
  2460.     
  2461.     class D(C):
  2462.         pass
  2463.  
  2464.     b = D()
  2465.     vereq(b.foo, 3)
  2466.     verify(b.__class__ is D)
  2467.  
  2468.  
  2469. def altmro():
  2470.     if verbose:
  2471.         print 'Testing mro() and overriding it...'
  2472.     
  2473.     
  2474.     class A(object):
  2475.         
  2476.         def f(self):
  2477.             return 'A'
  2478.  
  2479.  
  2480.     
  2481.     class B(A):
  2482.         pass
  2483.  
  2484.     
  2485.     class C(A):
  2486.         
  2487.         def f(self):
  2488.             return 'C'
  2489.  
  2490.  
  2491.     
  2492.     class D(B, C):
  2493.         pass
  2494.  
  2495.     vereq(D.mro(), [
  2496.         D,
  2497.         B,
  2498.         C,
  2499.         A,
  2500.         object])
  2501.     vereq(D.__mro__, (D, B, C, A, object))
  2502.     vereq(D().f(), 'C')
  2503.     
  2504.     class PerverseMetaType(type):
  2505.         
  2506.         def mro(cls):
  2507.             L = type.mro(cls)
  2508.             L.reverse()
  2509.             return L
  2510.  
  2511.  
  2512.     
  2513.     class X(D, B, C, A):
  2514.         __metaclass__ = PerverseMetaType
  2515.  
  2516.     vereq(X.__mro__, (object, A, C, B, D, X))
  2517.     vereq(X().f(), 'A')
  2518.  
  2519.  
  2520. def overloading():
  2521.     if verbose:
  2522.         print 'Testing operator overloading...'
  2523.     
  2524.     
  2525.     class B(object):
  2526.         """Intermediate class because object doesn't have a __setattr__"""
  2527.         pass
  2528.  
  2529.     
  2530.     class C(B):
  2531.         
  2532.         def __getattr__(self, name):
  2533.             if name == 'foo':
  2534.                 return ('getattr', name)
  2535.             else:
  2536.                 raise AttributeError
  2537.  
  2538.         
  2539.         def __setattr__(self, name, value):
  2540.             if name == 'foo':
  2541.                 self.setattr = (name, value)
  2542.             else:
  2543.                 return B.__setattr__(self, name, value)
  2544.  
  2545.         
  2546.         def __delattr__(self, name):
  2547.             if name == 'foo':
  2548.                 self.delattr = name
  2549.             else:
  2550.                 return B.__delattr__(self, name)
  2551.  
  2552.         
  2553.         def __getitem__(self, key):
  2554.             return ('getitem', key)
  2555.  
  2556.         
  2557.         def __setitem__(self, key, value):
  2558.             self.setitem = (key, value)
  2559.  
  2560.         
  2561.         def __delitem__(self, key):
  2562.             self.delitem = key
  2563.  
  2564.         
  2565.         def __getslice__(self, i, j):
  2566.             return ('getslice', i, j)
  2567.  
  2568.         
  2569.         def __setslice__(self, i, j, value):
  2570.             self.setslice = (i, j, value)
  2571.  
  2572.         
  2573.         def __delslice__(self, i, j):
  2574.             self.delslice = (i, j)
  2575.  
  2576.  
  2577.     a = C()
  2578.     vereq(a.foo, ('getattr', 'foo'))
  2579.     a.foo = 12
  2580.     vereq(a.setattr, ('foo', 12))
  2581.     del a.foo
  2582.     vereq(a.delattr, 'foo')
  2583.     vereq(a[12], ('getitem', 12))
  2584.     a[12] = 21
  2585.     vereq(a.setitem, (12, 21))
  2586.     del a[12]
  2587.     vereq(a.delitem, 12)
  2588.     vereq(a[0:10], ('getslice', 0, 10))
  2589.     a[0:10] = 'foo'
  2590.     vereq(a.setslice, (0, 10, 'foo'))
  2591.     del a[0:10]
  2592.     vereq(a.delslice, (0, 10))
  2593.  
  2594.  
  2595. def methods():
  2596.     if verbose:
  2597.         print 'Testing methods...'
  2598.     
  2599.     
  2600.     class C(object):
  2601.         
  2602.         def __init__(self, x):
  2603.             self.x = x
  2604.  
  2605.         
  2606.         def foo(self):
  2607.             return self.x
  2608.  
  2609.  
  2610.     c1 = C(1)
  2611.     vereq(c1.foo(), 1)
  2612.     
  2613.     class D(C):
  2614.         boo = C.foo
  2615.         goo = c1.foo
  2616.  
  2617.     d2 = D(2)
  2618.     vereq(d2.foo(), 2)
  2619.     vereq(d2.boo(), 2)
  2620.     vereq(d2.goo(), 1)
  2621.     
  2622.     class E(object):
  2623.         foo = C.foo
  2624.  
  2625.     vereq(E().foo, C.foo)
  2626.     verify(repr(C.foo.__get__(C(1))).startswith('<bound method '))
  2627.  
  2628.  
  2629. def specials():
  2630.     if verbose:
  2631.         print 'Testing special operators...'
  2632.     
  2633.     
  2634.     class C(object):
  2635.         
  2636.         def __getitem__(self, i):
  2637.             if i <= i:
  2638.                 pass
  2639.             elif i < 10:
  2640.                 return i
  2641.             
  2642.             raise IndexError
  2643.  
  2644.  
  2645.     c1 = C()
  2646.     c2 = C()
  2647.     verify(not (not c1))
  2648.     vereq(hash(c1), id(c1))
  2649.     vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
  2650.     vereq(c1, c1)
  2651.     verify(c1 != c2)
  2652.     verify(not (c1 != c1))
  2653.     verify(not (c1 == c2))
  2654.     verify(str(c1).find('C object at ') >= 0)
  2655.     vereq(str(c1), repr(c1))
  2656.     verify(-1 not in c1)
  2657.     for i in range(10):
  2658.         verify(i in c1)
  2659.     
  2660.     verify(10 not in c1)
  2661.     
  2662.     class D(object):
  2663.         
  2664.         def __getitem__(self, i):
  2665.             if i <= i:
  2666.                 pass
  2667.             elif i < 10:
  2668.                 return i
  2669.             
  2670.             raise IndexError
  2671.  
  2672.  
  2673.     d1 = D()
  2674.     d2 = D()
  2675.     verify(not (not d1))
  2676.     vereq(hash(d1), id(d1))
  2677.     vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
  2678.     vereq(d1, d1)
  2679.     verify(d1 != d2)
  2680.     verify(not (d1 != d1))
  2681.     verify(not (d1 == d2))
  2682.     verify(str(d1).find('D object at ') >= 0)
  2683.     vereq(str(d1), repr(d1))
  2684.     verify(-1 not in d1)
  2685.     for i in range(10):
  2686.         verify(i in d1)
  2687.     
  2688.     verify(10 not in d1)
  2689.     
  2690.     class Proxy(object):
  2691.         
  2692.         def __init__(self, x):
  2693.             self.x = x
  2694.  
  2695.         
  2696.         def __nonzero__(self):
  2697.             return not (not (self.x))
  2698.  
  2699.         
  2700.         def __hash__(self):
  2701.             return hash(self.x)
  2702.  
  2703.         
  2704.         def __eq__(self, other):
  2705.             return self.x == other
  2706.  
  2707.         
  2708.         def __ne__(self, other):
  2709.             return self.x != other
  2710.  
  2711.         
  2712.         def __cmp__(self, other):
  2713.             return cmp(self.x, other.x)
  2714.  
  2715.         
  2716.         def __str__(self):
  2717.             return 'Proxy:%s' % self.x
  2718.  
  2719.         
  2720.         def __repr__(self):
  2721.             return 'Proxy(%r)' % self.x
  2722.  
  2723.         
  2724.         def __contains__(self, value):
  2725.             return value in self.x
  2726.  
  2727.  
  2728.     p0 = Proxy(0)
  2729.     p1 = Proxy(1)
  2730.     p_1 = Proxy(-1)
  2731.     verify(not p0)
  2732.     verify(not (not p1))
  2733.     vereq(hash(p0), hash(0))
  2734.     vereq(p0, p0)
  2735.     verify(p0 != p1)
  2736.     verify(not (p0 != p0))
  2737.     vereq(not p0, p1)
  2738.     vereq(cmp(p0, p1), -1)
  2739.     vereq(cmp(p0, p0), 0)
  2740.     vereq(cmp(p0, p_1), 1)
  2741.     vereq(str(p0), 'Proxy:0')
  2742.     vereq(repr(p0), 'Proxy(0)')
  2743.     p10 = Proxy(range(10))
  2744.     verify(-1 not in p10)
  2745.     for i in range(10):
  2746.         verify(i in p10)
  2747.     
  2748.     verify(10 not in p10)
  2749.     
  2750.     class DProxy(object):
  2751.         
  2752.         def __init__(self, x):
  2753.             self.x = x
  2754.  
  2755.         
  2756.         def __nonzero__(self):
  2757.             return not (not (self.x))
  2758.  
  2759.         
  2760.         def __hash__(self):
  2761.             return hash(self.x)
  2762.  
  2763.         
  2764.         def __eq__(self, other):
  2765.             return self.x == other
  2766.  
  2767.         
  2768.         def __ne__(self, other):
  2769.             return self.x != other
  2770.  
  2771.         
  2772.         def __cmp__(self, other):
  2773.             return cmp(self.x, other.x)
  2774.  
  2775.         
  2776.         def __str__(self):
  2777.             return 'DProxy:%s' % self.x
  2778.  
  2779.         
  2780.         def __repr__(self):
  2781.             return 'DProxy(%r)' % self.x
  2782.  
  2783.         
  2784.         def __contains__(self, value):
  2785.             return value in self.x
  2786.  
  2787.  
  2788.     p0 = DProxy(0)
  2789.     p1 = DProxy(1)
  2790.     p_1 = DProxy(-1)
  2791.     verify(not p0)
  2792.     verify(not (not p1))
  2793.     vereq(hash(p0), hash(0))
  2794.     vereq(p0, p0)
  2795.     verify(p0 != p1)
  2796.     verify(not (p0 != p0))
  2797.     vereq(not p0, p1)
  2798.     vereq(cmp(p0, p1), -1)
  2799.     vereq(cmp(p0, p0), 0)
  2800.     vereq(cmp(p0, p_1), 1)
  2801.     vereq(str(p0), 'DProxy:0')
  2802.     vereq(repr(p0), 'DProxy(0)')
  2803.     p10 = DProxy(range(10))
  2804.     verify(-1 not in p10)
  2805.     for i in range(10):
  2806.         verify(i in p10)
  2807.     
  2808.     verify(10 not in p10)
  2809.     
  2810.     def unsafecmp(a, b):
  2811.         
  2812.         try:
  2813.             a.__class__.__cmp__(a, b)
  2814.         except TypeError:
  2815.             pass
  2816.  
  2817.         raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (a.__class__, a, b)
  2818.  
  2819.     unsafecmp(u'123', '123')
  2820.     unsafecmp('123', u'123')
  2821.     unsafecmp(1, 1.0)
  2822.     unsafecmp(1.0, 1)
  2823.     unsafecmp(1, 0x1L)
  2824.     unsafecmp(0x1L, 1)
  2825.     
  2826.     class Letter(str):
  2827.         
  2828.         def __new__(cls, letter):
  2829.             if letter == 'EPS':
  2830.                 return str.__new__(cls)
  2831.             
  2832.             return str.__new__(cls, letter)
  2833.  
  2834.         
  2835.         def __str__(self):
  2836.             if not self:
  2837.                 return 'EPS'
  2838.             
  2839.             return self
  2840.  
  2841.  
  2842.     import sys
  2843.     test_stdout = sys.stdout
  2844.     sys.stdout = get_original_stdout()
  2845.     
  2846.     try:
  2847.         print Letter('w')
  2848.     except RuntimeError:
  2849.         pass
  2850.  
  2851.     raise TestFailed, 'expected a RuntimeError for print recursion'
  2852.     sys.stdout = test_stdout
  2853.  
  2854.  
  2855. def weakrefs():
  2856.     if verbose:
  2857.         print 'Testing weak references...'
  2858.     
  2859.     import weakref as weakref
  2860.     
  2861.     class C(object):
  2862.         pass
  2863.  
  2864.     c = C()
  2865.     r = weakref.ref(c)
  2866.     verify(r() is c)
  2867.     del c
  2868.     verify(r() is None)
  2869.     del r
  2870.     
  2871.     class NoWeak(object):
  2872.         __slots__ = [
  2873.             'foo']
  2874.  
  2875.     no = NoWeak()
  2876.     
  2877.     try:
  2878.         weakref.ref(no)
  2879.     except TypeError:
  2880.         msg = None
  2881.         verify(str(msg).find('weak reference') >= 0)
  2882.  
  2883.     verify(0, 'weakref.ref(no) should be illegal')
  2884.     
  2885.     class Weak(object):
  2886.         __slots__ = [
  2887.             'foo',
  2888.             '__weakref__']
  2889.  
  2890.     yes = Weak()
  2891.     r = weakref.ref(yes)
  2892.     verify(r() is yes)
  2893.     del yes
  2894.     verify(r() is None)
  2895.     del r
  2896.  
  2897.  
  2898. def properties():
  2899.     if verbose:
  2900.         print 'Testing property...'
  2901.     
  2902.     
  2903.     class C(object):
  2904.         
  2905.         def getx(self):
  2906.             return self._C__x
  2907.  
  2908.         
  2909.         def setx(self, value):
  2910.             self._C__x = value
  2911.  
  2912.         
  2913.         def delx(self):
  2914.             del self._C__x
  2915.  
  2916.         x = property(getx, setx, delx, doc = "I'm the x property.")
  2917.  
  2918.     a = C()
  2919.     verify(not hasattr(a, 'x'))
  2920.     a.x = 42
  2921.     vereq(a._C__x, 42)
  2922.     vereq(a.x, 42)
  2923.     del a.x
  2924.     verify(not hasattr(a, 'x'))
  2925.     verify(not hasattr(a, '_C__x'))
  2926.     C.x.__set__(a, 100)
  2927.     vereq(C.x.__get__(a), 100)
  2928.     C.x.__delete__(a)
  2929.     verify(not hasattr(a, 'x'))
  2930.     raw = C.__dict__['x']
  2931.     verify(isinstance(raw, property))
  2932.     attrs = dir(raw)
  2933.     verify('__doc__' in attrs)
  2934.     verify('fget' in attrs)
  2935.     verify('fset' in attrs)
  2936.     verify('fdel' in attrs)
  2937.     vereq(raw.__doc__, "I'm the x property.")
  2938.     verify(raw.fget is C.__dict__['getx'])
  2939.     verify(raw.fset is C.__dict__['setx'])
  2940.     verify(raw.fdel is C.__dict__['delx'])
  2941.     for attr in ('__doc__', 'fget', 'fset', 'fdel'):
  2942.         
  2943.         try:
  2944.             setattr(raw, attr, 42)
  2945.         except TypeError:
  2946.             msg = None
  2947.             if str(msg).find('readonly') < 0:
  2948.                 raise TestFailed('when setting readonly attr %r on a property, got unexpected TypeError msg %r' % (attr, str(msg)))
  2949.             
  2950.             str(msg).find('readonly') < 0
  2951.  
  2952.         raise TestFailed('expected TypeError from trying to set readonly %r attr on a property' % attr)
  2953.     
  2954.     
  2955.     class D(object):
  2956.         __getitem__ = property((lambda s: 1 / 0))
  2957.  
  2958.     d = D()
  2959.     
  2960.     try:
  2961.         for i in d:
  2962.             str(i)
  2963.     except ZeroDivisionError:
  2964.         pass
  2965.  
  2966.     raise TestFailed, 'expected ZeroDivisionError from bad property'
  2967.  
  2968.  
  2969. def supers():
  2970.     if verbose:
  2971.         print 'Testing super...'
  2972.     
  2973.     
  2974.     class A(object):
  2975.         
  2976.         def meth(self, a):
  2977.             return 'A(%r)' % a
  2978.  
  2979.  
  2980.     vereq(A().meth(1), 'A(1)')
  2981.     
  2982.     class B(A):
  2983.         
  2984.         def __init__(self):
  2985.             self._B__super = super(B, self)
  2986.  
  2987.         
  2988.         def meth(self, a):
  2989.             return 'B(%r)' % a + self._B__super.meth(a)
  2990.  
  2991.  
  2992.     vereq(B().meth(2), 'B(2)A(2)')
  2993.     
  2994.     class C(A):
  2995.         
  2996.         def meth(self, a):
  2997.             return 'C(%r)' % a + self._C__super.meth(a)
  2998.  
  2999.  
  3000.     C._C__super = super(C)
  3001.     vereq(C().meth(3), 'C(3)A(3)')
  3002.     
  3003.     class D(C, B):
  3004.         
  3005.         def meth(self, a):
  3006.             return 'D(%r)' % a + super(D, self).meth(a)
  3007.  
  3008.  
  3009.     vereq(D().meth(4), 'D(4)C(4)B(4)A(4)')
  3010.     
  3011.     class mysuper(super):
  3012.         
  3013.         def __init__(self, *args):
  3014.             return super(mysuper, self).__init__(*args)
  3015.  
  3016.  
  3017.     
  3018.     class E(D):
  3019.         
  3020.         def meth(self, a):
  3021.             return 'E(%r)' % a + mysuper(E, self).meth(a)
  3022.  
  3023.  
  3024.     vereq(E().meth(5), 'E(5)D(5)C(5)B(5)A(5)')
  3025.     
  3026.     class F(E):
  3027.         
  3028.         def meth(self, a):
  3029.             s = self._F__super
  3030.             return 'F(%r)[%s]' % (a, s.__class__.__name__) + s.meth(a)
  3031.  
  3032.  
  3033.     F._F__super = mysuper(F)
  3034.     vereq(F().meth(6), 'F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)')
  3035.     
  3036.     try:
  3037.         super(D, 42)
  3038.     except TypeError:
  3039.         pass
  3040.  
  3041.     raise TestFailed, "shouldn't allow super(D, 42)"
  3042.     
  3043.     try:
  3044.         super(D, C())
  3045.     except TypeError:
  3046.         pass
  3047.  
  3048.     raise TestFailed, "shouldn't allow super(D, C())"
  3049.     
  3050.     try:
  3051.         super(D).__get__(12)
  3052.     except TypeError:
  3053.         pass
  3054.  
  3055.     raise TestFailed, "shouldn't allow super(D).__get__(12)"
  3056.     
  3057.     try:
  3058.         super(D).__get__(C())
  3059.     except TypeError:
  3060.         pass
  3061.  
  3062.     raise TestFailed, "shouldn't allow super(D).__get__(C())"
  3063.     
  3064.     class DDbase(object):
  3065.         
  3066.         def getx(self):
  3067.             return 42
  3068.  
  3069.         x = property(getx)
  3070.  
  3071.     
  3072.     class DDsub(DDbase):
  3073.         
  3074.         def getx(self):
  3075.             return 'hello'
  3076.  
  3077.         x = property(getx)
  3078.  
  3079.     dd = DDsub()
  3080.     vereq(dd.x, 'hello')
  3081.     vereq(super(DDsub, dd).x, 42)
  3082.     
  3083.     class Base(object):
  3084.         aProp = property((lambda self: 'foo'))
  3085.  
  3086.     
  3087.     class Sub(Base):
  3088.         
  3089.         def test(klass):
  3090.             return super(Sub, klass).aProp
  3091.  
  3092.         test = classmethod(test)
  3093.  
  3094.     veris(Sub.test(), Base.aProp)
  3095.  
  3096.  
  3097. def inherits():
  3098.     if verbose:
  3099.         print 'Testing inheritance from basic types...'
  3100.     
  3101.     
  3102.     class hexint(int):
  3103.         
  3104.         def __repr__(self):
  3105.             return hex(self)
  3106.  
  3107.         
  3108.         def __add__(self, other):
  3109.             return hexint(int.__add__(self, other))
  3110.  
  3111.  
  3112.     vereq(repr(hexint(7) + 9), '0x10')
  3113.     vereq(repr(hexint(1000) + 7), '0x3ef')
  3114.     a = hexint(12345)
  3115.     vereq(a, 12345)
  3116.     vereq(int(a), 12345)
  3117.     verify(int(a).__class__ is int)
  3118.     vereq(hash(a), hash(12345))
  3119.     verify(+a.__class__ is int)
  3120.     verify((a >> 0).__class__ is int)
  3121.     verify((a << 0).__class__ is int)
  3122.     verify((hexint(0) << 12).__class__ is int)
  3123.     verify((hexint(0) >> 12).__class__ is int)
  3124.     
  3125.     class octlong(long):
  3126.         __slots__ = []
  3127.         
  3128.         def __str__(self):
  3129.             s = oct(self)
  3130.             if s[-1] == 'L':
  3131.                 s = s[:-1]
  3132.             
  3133.             return s
  3134.  
  3135.         
  3136.         def __add__(self, other):
  3137.             return self.__class__(super(octlong, self).__add__(other))
  3138.  
  3139.         __radd__ = __add__
  3140.  
  3141.     vereq(str(octlong(3) + 5), '010')
  3142.     vereq(str(5 + octlong(3000)), '05675')
  3143.     a = octlong(12345)
  3144.     vereq(a, 0x3039L)
  3145.     vereq(long(a), 0x3039L)
  3146.     vereq(hash(a), hash(0x3039L))
  3147.     verify(long(a).__class__ is long)
  3148.     verify(+a.__class__ is long)
  3149.     verify(-a.__class__ is long)
  3150.     verify(-octlong(0).__class__ is long)
  3151.     verify((a >> 0).__class__ is long)
  3152.     verify((a << 0).__class__ is long)
  3153.     verify((a - 0).__class__ is long)
  3154.     verify((a * 1).__class__ is long)
  3155.     verify((a ** 1).__class__ is long)
  3156.     verify((a // 1).__class__ is long)
  3157.     verify((1 * a).__class__ is long)
  3158.     verify((a | 0).__class__ is long)
  3159.     verify((a ^ 0).__class__ is long)
  3160.     verify((a & -0x1L).__class__ is long)
  3161.     verify((octlong(0) << 12).__class__ is long)
  3162.     verify((octlong(0) >> 12).__class__ is long)
  3163.     verify(abs(octlong(0)).__class__ is long)
  3164.     
  3165.     class longclone(long):
  3166.         pass
  3167.  
  3168.     a = longclone(1)
  3169.     verify((a + 0).__class__ is long)
  3170.     verify((0 + a).__class__ is long)
  3171.     a = longclone(-1)
  3172.     vereq(a.__dict__, { })
  3173.     vereq(long(a), -1)
  3174.     
  3175.     class precfloat(float):
  3176.         __slots__ = [
  3177.             'prec']
  3178.         
  3179.         def __init__(self, value = 0.0, prec = 12):
  3180.             self.prec = int(prec)
  3181.             float.__init__(value)
  3182.  
  3183.         
  3184.         def __repr__(self):
  3185.             return '%.*g' % (self.prec, self)
  3186.  
  3187.  
  3188.     vereq(repr(precfloat(1.1000000000000001)), '1.1')
  3189.     a = precfloat(12345)
  3190.     vereq(a, 12345.0)
  3191.     vereq(float(a), 12345.0)
  3192.     verify(float(a).__class__ is float)
  3193.     vereq(hash(a), hash(12345.0))
  3194.     verify(+a.__class__ is float)
  3195.     
  3196.     class madcomplex(complex):
  3197.         
  3198.         def __repr__(self):
  3199.             return '%.17gj%+.17g' % (self.imag, self.real)
  3200.  
  3201.  
  3202.     a = madcomplex(-3, 4)
  3203.     vereq(repr(a), '4j-3')
  3204.     base = complex(-3, 4)
  3205.     veris(base.__class__, complex)
  3206.     vereq(a, base)
  3207.     vereq(complex(a), base)
  3208.     veris(complex(a).__class__, complex)
  3209.     a = madcomplex(a)
  3210.     vereq(repr(a), '4j-3')
  3211.     vereq(a, base)
  3212.     vereq(complex(a), base)
  3213.     veris(complex(a).__class__, complex)
  3214.     vereq(hash(a), hash(base))
  3215.     veris(+a.__class__, complex)
  3216.     veris((a + 0).__class__, complex)
  3217.     vereq(a + 0, base)
  3218.     veris((a - 0).__class__, complex)
  3219.     vereq(a - 0, base)
  3220.     veris((a * 1).__class__, complex)
  3221.     vereq(a * 1, base)
  3222.     veris((a / 1).__class__, complex)
  3223.     vereq(a / 1, base)
  3224.     
  3225.     class madtuple(tuple):
  3226.         _rev = None
  3227.         
  3228.         def rev(self):
  3229.             if self._rev is not None:
  3230.                 return self._rev
  3231.             
  3232.             L = list(self)
  3233.             L.reverse()
  3234.             self._rev = self.__class__(L)
  3235.             return self._rev
  3236.  
  3237.  
  3238.     a = madtuple((1, 2, 3, 4, 5, 6, 7, 8, 9, 0))
  3239.     vereq(a, (1, 2, 3, 4, 5, 6, 7, 8, 9, 0))
  3240.     vereq(a.rev(), madtuple((0, 9, 8, 7, 6, 5, 4, 3, 2, 1)))
  3241.     vereq(a.rev().rev(), madtuple((1, 2, 3, 4, 5, 6, 7, 8, 9, 0)))
  3242.     for i in range(512):
  3243.         t = madtuple(range(i))
  3244.         u = t.rev()
  3245.         v = u.rev()
  3246.         vereq(v, t)
  3247.     
  3248.     a = madtuple((1, 2, 3, 4, 5))
  3249.     vereq(tuple(a), (1, 2, 3, 4, 5))
  3250.     verify(tuple(a).__class__ is tuple)
  3251.     vereq(hash(a), hash((1, 2, 3, 4, 5)))
  3252.     verify(a[:].__class__ is tuple)
  3253.     verify((a * 1).__class__ is tuple)
  3254.     verify((a * 0).__class__ is tuple)
  3255.     verify((a + ()).__class__ is tuple)
  3256.     a = madtuple(())
  3257.     vereq(tuple(a), ())
  3258.     verify(tuple(a).__class__ is tuple)
  3259.     verify((a + a).__class__ is tuple)
  3260.     verify((a * 0).__class__ is tuple)
  3261.     verify((a * 1).__class__ is tuple)
  3262.     verify((a * 2).__class__ is tuple)
  3263.     verify(a[:].__class__ is tuple)
  3264.     
  3265.     class madstring(str):
  3266.         _rev = None
  3267.         
  3268.         def rev(self):
  3269.             if self._rev is not None:
  3270.                 return self._rev
  3271.             
  3272.             L = list(self)
  3273.             L.reverse()
  3274.             self._rev = self.__class__(''.join(L))
  3275.             return self._rev
  3276.  
  3277.  
  3278.     s = madstring('abcdefghijklmnopqrstuvwxyz')
  3279.     vereq(s, 'abcdefghijklmnopqrstuvwxyz')
  3280.     vereq(s.rev(), madstring('zyxwvutsrqponmlkjihgfedcba'))
  3281.     vereq(s.rev().rev(), madstring('abcdefghijklmnopqrstuvwxyz'))
  3282.     for i in range(256):
  3283.         s = madstring(''.join(map(chr, range(i))))
  3284.         t = s.rev()
  3285.         u = t.rev()
  3286.         vereq(u, s)
  3287.     
  3288.     s = madstring('12345')
  3289.     vereq(str(s), '12345')
  3290.     verify(str(s).__class__ is str)
  3291.     base = '\x00' * 5
  3292.     s = madstring(base)
  3293.     vereq(s, base)
  3294.     vereq(str(s), base)
  3295.     verify(str(s).__class__ is str)
  3296.     vereq(hash(s), hash(base))
  3297.     vereq({
  3298.         s: 1 }[base], 1)
  3299.     vereq({
  3300.         base: 1 }[s], 1)
  3301.     verify((s + '').__class__ is str)
  3302.     vereq(s + '', base)
  3303.     verify(('' + s).__class__ is str)
  3304.     vereq('' + s, base)
  3305.     verify((s * 0).__class__ is str)
  3306.     vereq(s * 0, '')
  3307.     verify((s * 1).__class__ is str)
  3308.     vereq(s * 1, base)
  3309.     verify((s * 2).__class__ is str)
  3310.     vereq(s * 2, base + base)
  3311.     verify(s[:].__class__ is str)
  3312.     vereq(s[:], base)
  3313.     verify(s[0:0].__class__ is str)
  3314.     vereq(s[0:0], '')
  3315.     verify(s.strip().__class__ is str)
  3316.     vereq(s.strip(), base)
  3317.     verify(s.lstrip().__class__ is str)
  3318.     vereq(s.lstrip(), base)
  3319.     verify(s.rstrip().__class__ is str)
  3320.     vereq(s.rstrip(), base)
  3321.     identitytab = []([ chr(i) for i in range(256) ])
  3322.     verify(s.translate(identitytab).__class__ is str)
  3323.     vereq(s.translate(identitytab), base)
  3324.     verify(s.translate(identitytab, 'x').__class__ is str)
  3325.     vereq(s.translate(identitytab, 'x'), base)
  3326.     vereq(s.translate(identitytab, '\x00'), '')
  3327.     verify(s.replace('x', 'x').__class__ is str)
  3328.     vereq(s.replace('x', 'x'), base)
  3329.     verify(s.ljust(len(s)).__class__ is str)
  3330.     vereq(s.ljust(len(s)), base)
  3331.     verify(s.rjust(len(s)).__class__ is str)
  3332.     vereq(s.rjust(len(s)), base)
  3333.     verify(s.center(len(s)).__class__ is str)
  3334.     vereq(s.center(len(s)), base)
  3335.     verify(s.lower().__class__ is str)
  3336.     vereq(s.lower(), base)
  3337.     
  3338.     class madunicode(unicode):
  3339.         _rev = None
  3340.         
  3341.         def rev(self):
  3342.             if self._rev is not None:
  3343.                 return self._rev
  3344.             
  3345.             L = list(self)
  3346.             L.reverse()
  3347.             self._rev = self.__class__(u''.join(L))
  3348.             return self._rev
  3349.  
  3350.  
  3351.     u = madunicode('ABCDEF')
  3352.     vereq(u, u'ABCDEF')
  3353.     vereq(u.rev(), madunicode(u'FEDCBA'))
  3354.     vereq(u.rev().rev(), madunicode(u'ABCDEF'))
  3355.     base = u'12345'
  3356.     u = madunicode(base)
  3357.     vereq(unicode(u), base)
  3358.     verify(unicode(u).__class__ is unicode)
  3359.     vereq(hash(u), hash(base))
  3360.     vereq({
  3361.         u: 1 }[base], 1)
  3362.     vereq({
  3363.         base: 1 }[u], 1)
  3364.     verify(u.strip().__class__ is unicode)
  3365.     vereq(u.strip(), base)
  3366.     verify(u.lstrip().__class__ is unicode)
  3367.     vereq(u.lstrip(), base)
  3368.     verify(u.rstrip().__class__ is unicode)
  3369.     vereq(u.rstrip(), base)
  3370.     verify(u.replace(u'x', u'x').__class__ is unicode)
  3371.     vereq(u.replace(u'x', u'x'), base)
  3372.     verify(u.replace(u'xy', u'xy').__class__ is unicode)
  3373.     vereq(u.replace(u'xy', u'xy'), base)
  3374.     verify(u.center(len(u)).__class__ is unicode)
  3375.     vereq(u.center(len(u)), base)
  3376.     verify(u.ljust(len(u)).__class__ is unicode)
  3377.     vereq(u.ljust(len(u)), base)
  3378.     verify(u.rjust(len(u)).__class__ is unicode)
  3379.     vereq(u.rjust(len(u)), base)
  3380.     verify(u.lower().__class__ is unicode)
  3381.     vereq(u.lower(), base)
  3382.     verify(u.upper().__class__ is unicode)
  3383.     vereq(u.upper(), base)
  3384.     verify(u.capitalize().__class__ is unicode)
  3385.     vereq(u.capitalize(), base)
  3386.     verify(u.title().__class__ is unicode)
  3387.     vereq(u.title(), base)
  3388.     verify((u + u'').__class__ is unicode)
  3389.     vereq(u + u'', base)
  3390.     verify((u'' + u).__class__ is unicode)
  3391.     vereq(u'' + u, base)
  3392.     verify((u * 0).__class__ is unicode)
  3393.     vereq(u * 0, u'')
  3394.     verify((u * 1).__class__ is unicode)
  3395.     vereq(u * 1, base)
  3396.     verify((u * 2).__class__ is unicode)
  3397.     vereq(u * 2, base + base)
  3398.     verify(u[:].__class__ is unicode)
  3399.     vereq(u[:], base)
  3400.     verify(u[0:0].__class__ is unicode)
  3401.     vereq(u[0:0], u'')
  3402.     
  3403.     class sublist(list):
  3404.         pass
  3405.  
  3406.     a = sublist(range(5))
  3407.     vereq(a, range(5))
  3408.     a.append('hello')
  3409.     vereq(a, range(5) + [
  3410.         'hello'])
  3411.     a[5] = 5
  3412.     vereq(a, range(6))
  3413.     a.extend(range(6, 20))
  3414.     vereq(a, range(20))
  3415.     a[-5:] = []
  3416.     vereq(a, range(15))
  3417.     del a[10:15]
  3418.     vereq(len(a), 10)
  3419.     vereq(a, range(10))
  3420.     vereq(list(a), range(10))
  3421.     vereq(a[0], 0)
  3422.     vereq(a[9], 9)
  3423.     vereq(a[-10], 0)
  3424.     vereq(a[-1], 9)
  3425.     vereq(a[:5], range(5))
  3426.     
  3427.     class CountedInput(file):
  3428.         '''Counts lines read by self.readline().
  3429.  
  3430.         self.lineno is the 0-based ordinal of the last line read, up to
  3431.         a maximum of one greater than the number of lines in the file.
  3432.  
  3433.         self.ateof is true if and only if the final "" line has been read,
  3434.         at which point self.lineno stops incrementing, and further calls
  3435.         to readline() continue to return "".
  3436.         '''
  3437.         lineno = 0
  3438.         ateof = 0
  3439.         
  3440.         def readline(self):
  3441.             if self.ateof:
  3442.                 return ''
  3443.             
  3444.             s = file.readline(self)
  3445.             self.lineno += 1
  3446.             if s == '':
  3447.                 self.ateof = 1
  3448.             
  3449.             return s
  3450.  
  3451.  
  3452.     f = file(name = TESTFN, mode = 'w')
  3453.     lines = [
  3454.         'a\n',
  3455.         'b\n',
  3456.         'c\n']
  3457.     
  3458.     try:
  3459.         f.writelines(lines)
  3460.         f.close()
  3461.         f = CountedInput(TESTFN)
  3462.         for i, expected in zip(range(1, 5) + [
  3463.             4], lines + 2 * [
  3464.             '']):
  3465.             got = f.readline()
  3466.             vereq(expected, got)
  3467.             vereq(f.lineno, i)
  3468.             vereq(f.ateof, i > len(lines))
  3469.         
  3470.         f.close()
  3471.     finally:
  3472.         
  3473.         try:
  3474.             f.close()
  3475.         except:
  3476.             []
  3477.             ''.join
  3478.  
  3479.         
  3480.         try:
  3481.             import os as os
  3482.             os.unlink(TESTFN)
  3483.         except:
  3484.             []
  3485.             ''.join
  3486.  
  3487.  
  3488.  
  3489.  
  3490. def keywords():
  3491.     if verbose:
  3492.         print 'Testing keyword args to basic type constructors ...'
  3493.     
  3494.     vereq(int(x = 1), 1)
  3495.     vereq(float(x = 2), 2.0)
  3496.     vereq(long(x = 3), 0x3L)
  3497.     vereq(complex(imag = 42, real = 666), complex(666, 42))
  3498.     vereq(str(object = 500), '500')
  3499.     vereq(unicode(string = 'abc', errors = 'strict'), u'abc')
  3500.     vereq(tuple(sequence = range(3)), (0, 1, 2))
  3501.     vereq(list(sequence = (0, 1, 2)), range(3))
  3502.     for constructor in (int, float, long, complex, str, unicode, tuple, list, file):
  3503.         
  3504.         try:
  3505.             constructor(bogus_keyword_arg = 1)
  3506.         except TypeError:
  3507.             continue
  3508.  
  3509.         raise TestFailed('expected TypeError from bogus keyword argument to %r' % constructor)
  3510.     
  3511.  
  3512.  
  3513. def restricted():
  3514.     return None
  3515.     import rexec as rexec
  3516.     if verbose:
  3517.         print 'Testing interaction with restricted execution ...'
  3518.     
  3519.     sandbox = rexec.RExec()
  3520.     code1 = "f = open(%r, 'w')" % TESTFN
  3521.     code2 = "f = file(%r, 'w')" % TESTFN
  3522.     code3 = "f = open(%r)\nt = type(f)  # a sneaky way to get the file() constructor\nf.close()\nf = t(%r, 'w')  # rexec can't catch this by itself\n" % (TESTFN, TESTFN)
  3523.     f = open(TESTFN, 'w')
  3524.     f.close()
  3525.     
  3526.     try:
  3527.         for code in (code1, code2, code3):
  3528.             
  3529.             try:
  3530.                 sandbox.r_exec(code)
  3531.             except IOError:
  3532.                 msg = None
  3533.                 if str(msg).find('restricted') >= 0:
  3534.                     outcome = 'OK'
  3535.                 else:
  3536.                     outcome = 'got an exception, but not an expected one'
  3537.             except:
  3538.                 str(msg).find('restricted') >= 0
  3539.  
  3540.             outcome = 'expected a restricted-execution exception'
  3541.             if outcome != 'OK':
  3542.                 raise TestFailed('%s, in %r' % (outcome, code))
  3543.                 continue
  3544.     finally:
  3545.         
  3546.         try:
  3547.             import os
  3548.             os.unlink(TESTFN)
  3549.         except:
  3550.             pass
  3551.  
  3552.  
  3553.  
  3554.  
  3555. def str_subclass_as_dict_key():
  3556.     if verbose:
  3557.         print 'Testing a str subclass used as dict key ..'
  3558.     
  3559.     
  3560.     class cistr(str):
  3561.         '''Sublcass of str that computes __eq__ case-insensitively.
  3562.  
  3563.         Also computes a hash code of the string in canonical form.
  3564.         '''
  3565.         
  3566.         def __init__(self, value):
  3567.             self.canonical = value.lower()
  3568.             self.hashcode = hash(self.canonical)
  3569.  
  3570.         
  3571.         def __eq__(self, other):
  3572.             if not isinstance(other, cistr):
  3573.                 other = cistr(other)
  3574.             
  3575.             return self.canonical == other.canonical
  3576.  
  3577.         
  3578.         def __hash__(self):
  3579.             return self.hashcode
  3580.  
  3581.  
  3582.     vereq(cistr('ABC'), 'abc')
  3583.     vereq('aBc', cistr('ABC'))
  3584.     vereq(str(cistr('ABC')), 'ABC')
  3585.     d = {
  3586.         cistr('one'): 1,
  3587.         cistr('two'): 2,
  3588.         cistr('tHree'): 3 }
  3589.     vereq(d[cistr('one')], 1)
  3590.     vereq(d[cistr('tWo')], 2)
  3591.     vereq(d[cistr('THrEE')], 3)
  3592.     verify(cistr('ONe') in d)
  3593.     vereq(d.get(cistr('thrEE')), 3)
  3594.  
  3595.  
  3596. def classic_comparisons():
  3597.     if verbose:
  3598.         print 'Testing classic comparisons...'
  3599.     
  3600.     
  3601.     class classic:
  3602.         pass
  3603.  
  3604.     for base in (classic, int, object):
  3605.         if verbose:
  3606.             print '        (base = %s)' % base
  3607.         
  3608.         
  3609.         class C(base):
  3610.             
  3611.             def __init__(self, value):
  3612.                 self.value = int(value)
  3613.  
  3614.             
  3615.             def __cmp__(self, other):
  3616.                 if isinstance(other, C):
  3617.                     return cmp(self.value, other.value)
  3618.                 
  3619.                 if isinstance(other, int) or isinstance(other, long):
  3620.                     return cmp(self.value, other)
  3621.                 
  3622.                 return NotImplemented
  3623.  
  3624.  
  3625.         c1 = C(1)
  3626.         c2 = C(2)
  3627.         c3 = C(3)
  3628.         vereq(c1, 1)
  3629.         c = {
  3630.             1: c1,
  3631.             2: c2,
  3632.             3: c3 }
  3633.         for x in (1, 2, 3):
  3634.             for y in (1, 2, 3):
  3635.                 verify(cmp(c[x], c[y]) == cmp(x, y), 'x=%d, y=%d' % (x, y))
  3636.                 for op in ('<', '<=', '==', '!=', '>', '>='):
  3637.                     verify(eval('c[x] %s c[y]' % op) == eval('x %s y' % op), 'x=%d, y=%d' % (x, y))
  3638.                 
  3639.                 verify(cmp(c[x], y) == cmp(x, y), 'x=%d, y=%d' % (x, y))
  3640.                 verify(cmp(x, c[y]) == cmp(x, y), 'x=%d, y=%d' % (x, y))
  3641.             
  3642.         
  3643.     
  3644.  
  3645.  
  3646. def rich_comparisons():
  3647.     if verbose:
  3648.         print 'Testing rich comparisons...'
  3649.     
  3650.     
  3651.     class Z(complex):
  3652.         pass
  3653.  
  3654.     z = Z(1)
  3655.     vereq(z, 1 + (0.0+0.0j))
  3656.     vereq(1 + (0.0+0.0j), z)
  3657.     
  3658.     class ZZ(complex):
  3659.         
  3660.         def __eq__(self, other):
  3661.             
  3662.             try:
  3663.                 return abs(self - other) <= 9.9999999999999995e-07
  3664.             except:
  3665.                 return NotImplemented
  3666.  
  3667.  
  3668.  
  3669.     zz = ZZ(1.0000003)
  3670.     vereq(zz, 1 + (0.0+0.0j))
  3671.     vereq(1 + (0.0+0.0j), zz)
  3672.     
  3673.     class classic:
  3674.         pass
  3675.  
  3676.     for base in (classic, int, object, list):
  3677.         if verbose:
  3678.             print '        (base = %s)' % base
  3679.         
  3680.         
  3681.         class C(base):
  3682.             
  3683.             def __init__(self, value):
  3684.                 self.value = int(value)
  3685.  
  3686.             
  3687.             def __cmp__(self, other):
  3688.                 raise TestFailed, "shouldn't call __cmp__"
  3689.  
  3690.             
  3691.             def __eq__(self, other):
  3692.                 if isinstance(other, C):
  3693.                     return self.value == other.value
  3694.                 
  3695.                 if isinstance(other, int) or isinstance(other, long):
  3696.                     return self.value == other
  3697.                 
  3698.                 return NotImplemented
  3699.  
  3700.             
  3701.             def __ne__(self, other):
  3702.                 if isinstance(other, C):
  3703.                     return self.value != other.value
  3704.                 
  3705.                 if isinstance(other, int) or isinstance(other, long):
  3706.                     return self.value != other
  3707.                 
  3708.                 return NotImplemented
  3709.  
  3710.             
  3711.             def __lt__(self, other):
  3712.                 if isinstance(other, C):
  3713.                     return self.value < other.value
  3714.                 
  3715.                 if isinstance(other, int) or isinstance(other, long):
  3716.                     return self.value < other
  3717.                 
  3718.                 return NotImplemented
  3719.  
  3720.             
  3721.             def __le__(self, other):
  3722.                 if isinstance(other, C):
  3723.                     return self.value <= other.value
  3724.                 
  3725.                 if isinstance(other, int) or isinstance(other, long):
  3726.                     return self.value <= other
  3727.                 
  3728.                 return NotImplemented
  3729.  
  3730.             
  3731.             def __gt__(self, other):
  3732.                 if isinstance(other, C):
  3733.                     return self.value > other.value
  3734.                 
  3735.                 if isinstance(other, int) or isinstance(other, long):
  3736.                     return self.value > other
  3737.                 
  3738.                 return NotImplemented
  3739.  
  3740.             
  3741.             def __ge__(self, other):
  3742.                 if isinstance(other, C):
  3743.                     return self.value >= other.value
  3744.                 
  3745.                 if isinstance(other, int) or isinstance(other, long):
  3746.                     return self.value >= other
  3747.                 
  3748.                 return NotImplemented
  3749.  
  3750.  
  3751.         c1 = C(1)
  3752.         c2 = C(2)
  3753.         c3 = C(3)
  3754.         vereq(c1, 1)
  3755.         c = {
  3756.             1: c1,
  3757.             2: c2,
  3758.             3: c3 }
  3759.         for x in (1, 2, 3):
  3760.             for y in (1, 2, 3):
  3761.                 for op in ('<', '<=', '==', '!=', '>', '>='):
  3762.                     verify(eval('c[x] %s c[y]' % op) == eval('x %s y' % op), 'x=%d, y=%d' % (x, y))
  3763.                     verify(eval('c[x] %s y' % op) == eval('x %s y' % op), 'x=%d, y=%d' % (x, y))
  3764.                     verify(eval('x %s c[y]' % op) == eval('x %s y' % op), 'x=%d, y=%d' % (x, y))
  3765.                 
  3766.             
  3767.         
  3768.     
  3769.  
  3770.  
  3771. def coercions():
  3772.     if verbose:
  3773.         print 'Testing coercions...'
  3774.     
  3775.     
  3776.     class I(int):
  3777.         pass
  3778.  
  3779.     coerce(I(0), 0)
  3780.     coerce(0, I(0))
  3781.     
  3782.     class L(long):
  3783.         pass
  3784.  
  3785.     coerce(L(0), 0)
  3786.     coerce(L(0), 0x0L)
  3787.     coerce(0, L(0))
  3788.     coerce(0x0L, L(0))
  3789.     
  3790.     class F(float):
  3791.         pass
  3792.  
  3793.     coerce(F(0), 0)
  3794.     coerce(F(0), 0x0L)
  3795.     coerce(F(0), 0.0)
  3796.     coerce(0, F(0))
  3797.     coerce(0x0L, F(0))
  3798.     coerce(0.0, F(0))
  3799.     
  3800.     class C(complex):
  3801.         pass
  3802.  
  3803.     coerce(C(0), 0)
  3804.     coerce(C(0), 0x0L)
  3805.     coerce(C(0), 0.0)
  3806.     coerce(C(0), (0.0+0.0j))
  3807.     coerce(0, C(0))
  3808.     coerce(0x0L, C(0))
  3809.     coerce(0.0, C(0))
  3810.     coerce((0.0+0.0j), C(0))
  3811.  
  3812.  
  3813. def descrdoc():
  3814.     if verbose:
  3815.         print 'Testing descriptor doc strings...'
  3816.     
  3817.     
  3818.     def check(descr, what):
  3819.         vereq(descr.__doc__, what)
  3820.  
  3821.     check(file.closed, 'True if the file is closed')
  3822.     check(file.name, 'file name')
  3823.  
  3824.  
  3825. def setclass():
  3826.     if verbose:
  3827.         print 'Testing __class__ assignment...'
  3828.     
  3829.     
  3830.     class C(object):
  3831.         pass
  3832.  
  3833.     
  3834.     class D(object):
  3835.         pass
  3836.  
  3837.     
  3838.     class E(object):
  3839.         pass
  3840.  
  3841.     
  3842.     class F(D, E):
  3843.         pass
  3844.  
  3845.     for cls in (C, D, E, F):
  3846.         for cls2 in (C, D, E, F):
  3847.             x = cls()
  3848.             x.__class__ = cls2
  3849.             verify(x.__class__ is cls2)
  3850.             x.__class__ = cls
  3851.             verify(x.__class__ is cls)
  3852.         
  3853.     
  3854.     
  3855.     def cant(x, C):
  3856.         
  3857.         try:
  3858.             x.__class__ = C
  3859.         except TypeError:
  3860.             pass
  3861.  
  3862.         raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
  3863.         
  3864.         try:
  3865.             delattr(x, '__class__')
  3866.         except TypeError:
  3867.             pass
  3868.  
  3869.         raise TestFailed, "shouldn't allow del %r.__class__" % x
  3870.  
  3871.     cant(C(), list)
  3872.     cant(list(), C)
  3873.     cant(C(), 1)
  3874.     cant(C(), object)
  3875.     cant(object(), list)
  3876.     cant(list(), object)
  3877.     
  3878.     class Int(int):
  3879.         __slots__ = []
  3880.  
  3881.     cant(2, Int)
  3882.     cant(Int(), int)
  3883.     cant(True, int)
  3884.     cant(2, bool)
  3885.     o = object()
  3886.     cant(o, type(1))
  3887.     cant(o, type(None))
  3888.     del o
  3889.  
  3890.  
  3891. def setdict():
  3892.     if verbose:
  3893.         print 'Testing __dict__ assignment...'
  3894.     
  3895.     
  3896.     class C(object):
  3897.         pass
  3898.  
  3899.     a = C()
  3900.     a.__dict__ = {
  3901.         'b': 1 }
  3902.     vereq(a.b, 1)
  3903.     
  3904.     def cant(x, dict):
  3905.         
  3906.         try:
  3907.             x.__dict__ = dict
  3908.         except TypeError:
  3909.             pass
  3910.  
  3911.         raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
  3912.  
  3913.     cant(a, None)
  3914.     cant(a, [])
  3915.     cant(a, 1)
  3916.     del a.__dict__
  3917.     cant(C, { })
  3918.  
  3919.  
  3920. def pickles():
  3921.     global C, C1, C2, C3, C4classic, C4
  3922.     if verbose:
  3923.         print 'Testing pickling and copying new-style classes and objects...'
  3924.     
  3925.     import pickle as pickle
  3926.     import cPickle as cPickle
  3927.     
  3928.     def sorteditems(d):
  3929.         L = d.items()
  3930.         L.sort()
  3931.         return L
  3932.  
  3933.     
  3934.     class C(object):
  3935.         
  3936.         def __init__(self, a, b):
  3937.             super(C, self).__init__()
  3938.             self.a = a
  3939.             self.b = b
  3940.  
  3941.         
  3942.         def __repr__(self):
  3943.             return 'C(%r, %r)' % (self.a, self.b)
  3944.  
  3945.  
  3946.     
  3947.     class C1(list):
  3948.         
  3949.         def __new__(cls, a, b):
  3950.             return super(C1, cls).__new__(cls)
  3951.  
  3952.         
  3953.         def __getnewargs__(self):
  3954.             return (self.a, self.b)
  3955.  
  3956.         
  3957.         def __init__(self, a, b):
  3958.             self.a = a
  3959.             self.b = b
  3960.  
  3961.         
  3962.         def __repr__(self):
  3963.             return 'C1(%r, %r)<%r>' % (self.a, self.b, list(self))
  3964.  
  3965.  
  3966.     
  3967.     class C2(int):
  3968.         
  3969.         def __new__(cls, a, b, val = 0):
  3970.             return super(C2, cls).__new__(cls, val)
  3971.  
  3972.         
  3973.         def __getnewargs__(self):
  3974.             return (self.a, self.b, int(self))
  3975.  
  3976.         
  3977.         def __init__(self, a, b, val = 0):
  3978.             self.a = a
  3979.             self.b = b
  3980.  
  3981.         
  3982.         def __repr__(self):
  3983.             return 'C2(%r, %r)<%r>' % (self.a, self.b, int(self))
  3984.  
  3985.  
  3986.     
  3987.     class C3(object):
  3988.         
  3989.         def __init__(self, foo):
  3990.             self.foo = foo
  3991.  
  3992.         
  3993.         def __getstate__(self):
  3994.             return self.foo
  3995.  
  3996.         
  3997.         def __setstate__(self, foo):
  3998.             self.foo = foo
  3999.  
  4000.  
  4001.     
  4002.     class C4classic:
  4003.         pass
  4004.  
  4005.     
  4006.     class C4(C4classic, object):
  4007.         pass
  4008.  
  4009.     for p in (pickle, cPickle):
  4010.         for bin in (0, 1):
  4011.             if verbose:
  4012.                 print p.__name__, [
  4013.                     'text',
  4014.                     'binary'][bin]
  4015.             
  4016.             for cls in (C, C1, C2):
  4017.                 s = p.dumps(cls, bin)
  4018.                 cls2 = p.loads(s)
  4019.                 verify(cls2 is cls)
  4020.             
  4021.             a = C1(1, 2)
  4022.             a.append(42)
  4023.             a.append(24)
  4024.             b = C2('hello', 'world', 42)
  4025.             s = p.dumps((a, b), bin)
  4026.             (x, y) = p.loads(s)
  4027.             vereq(x.__class__, a.__class__)
  4028.             vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
  4029.             vereq(y.__class__, b.__class__)
  4030.             vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
  4031.             vereq(repr(x), repr(a))
  4032.             vereq(repr(y), repr(b))
  4033.             if verbose:
  4034.                 print 'a = x =', a
  4035.                 print 'b = y =', b
  4036.             
  4037.             u = C3(42)
  4038.             s = p.dumps(u, bin)
  4039.             v = p.loads(s)
  4040.             veris(u.__class__, v.__class__)
  4041.             vereq(u.foo, v.foo)
  4042.             u = C4()
  4043.             u.foo = 42
  4044.             s = p.dumps(u, bin)
  4045.             v = p.loads(s)
  4046.             veris(u.__class__, v.__class__)
  4047.             vereq(u.foo, v.foo)
  4048.         
  4049.     
  4050.     if verbose:
  4051.         print 'deepcopy'
  4052.     
  4053.     import copy
  4054.     for cls in (C, C1, C2):
  4055.         cls2 = copy.deepcopy(cls)
  4056.         verify(cls2 is cls)
  4057.     
  4058.     a = C1(1, 2)
  4059.     a.append(42)
  4060.     a.append(24)
  4061.     b = C2('hello', 'world', 42)
  4062.     (x, y) = copy.deepcopy((a, b))
  4063.     vereq(x.__class__, a.__class__)
  4064.     vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
  4065.     vereq(y.__class__, b.__class__)
  4066.     vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
  4067.     vereq(repr(x), repr(a))
  4068.     vereq(repr(y), repr(b))
  4069.     if verbose:
  4070.         print 'a = x =', a
  4071.         print 'b = y =', b
  4072.     
  4073.  
  4074.  
  4075. def pickleslots():
  4076.     global B, C, D, C, D, E
  4077.     if verbose:
  4078.         print 'Testing pickling of classes with __slots__ ...'
  4079.     
  4080.     import pickle
  4081.     import cPickle
  4082.     
  4083.     class B(object):
  4084.         pass
  4085.  
  4086.     for base in [
  4087.         object,
  4088.         B]:
  4089.         
  4090.         class C(base):
  4091.             __slots__ = [
  4092.                 'a']
  4093.  
  4094.         
  4095.         class D(C):
  4096.             pass
  4097.  
  4098.         
  4099.         try:
  4100.             pickle.dumps(C())
  4101.         except TypeError:
  4102.             pass
  4103.  
  4104.         raise TestFailed, 'should fail: pickle C instance - %s' % base
  4105.         
  4106.         try:
  4107.             cPickle.dumps(C())
  4108.         except TypeError:
  4109.             pass
  4110.  
  4111.         raise TestFailed, 'should fail: cPickle C instance - %s' % base
  4112.         
  4113.         try:
  4114.             pickle.dumps(C())
  4115.         except TypeError:
  4116.             pass
  4117.  
  4118.         raise TestFailed, 'should fail: pickle D instance - %s' % base
  4119.         
  4120.         try:
  4121.             cPickle.dumps(D())
  4122.         except TypeError:
  4123.             pass
  4124.  
  4125.         raise TestFailed, 'should fail: cPickle D instance - %s' % base
  4126.         
  4127.         class C(base):
  4128.             __slots__ = [
  4129.                 'a']
  4130.             
  4131.             def __getstate__(self):
  4132.                 
  4133.                 try:
  4134.                     d = self.__dict__.copy()
  4135.                 except AttributeError:
  4136.                     d = { }
  4137.  
  4138.                 for cls in self.__class__.__mro__:
  4139.                     for sn in cls.__dict__.get('__slots__', ()):
  4140.                         
  4141.                         try:
  4142.                             d[sn] = getattr(self, sn)
  4143.                         continue
  4144.                         except AttributeError:
  4145.                             continue
  4146.                         
  4147.  
  4148.                     
  4149.                 
  4150.                 return d
  4151.  
  4152.             
  4153.             def __setstate__(self, d):
  4154.                 for k, v in d.items():
  4155.                     setattr(self, k, v)
  4156.                 
  4157.  
  4158.  
  4159.         
  4160.         class D(C):
  4161.             pass
  4162.  
  4163.         x = C()
  4164.         y = pickle.loads(pickle.dumps(x))
  4165.         vereq(hasattr(y, 'a'), 0)
  4166.         y = cPickle.loads(cPickle.dumps(x))
  4167.         vereq(hasattr(y, 'a'), 0)
  4168.         x.a = 42
  4169.         y = pickle.loads(pickle.dumps(x))
  4170.         vereq(y.a, 42)
  4171.         y = cPickle.loads(cPickle.dumps(x))
  4172.         vereq(y.a, 42)
  4173.         x = D()
  4174.         x.a = 42
  4175.         x.b = 100
  4176.         y = pickle.loads(pickle.dumps(x))
  4177.         vereq(y.a + y.b, 142)
  4178.         y = cPickle.loads(cPickle.dumps(x))
  4179.         vereq(y.a + y.b, 142)
  4180.         
  4181.         class E(C):
  4182.             __slots__ = [
  4183.                 'b']
  4184.  
  4185.         x = E()
  4186.         x.a = 42
  4187.         x.b = 'foo'
  4188.         y = pickle.loads(pickle.dumps(x))
  4189.         vereq(y.a, x.a)
  4190.         vereq(y.b, x.b)
  4191.         y = cPickle.loads(cPickle.dumps(x))
  4192.         vereq(y.a, x.a)
  4193.         vereq(y.b, x.b)
  4194.     
  4195.  
  4196.  
  4197. def copies():
  4198.     if verbose:
  4199.         print 'Testing copy.copy() and copy.deepcopy()...'
  4200.     
  4201.     import copy
  4202.     
  4203.     class C(object):
  4204.         pass
  4205.  
  4206.     a = C()
  4207.     a.foo = 12
  4208.     b = copy.copy(a)
  4209.     vereq(b.__dict__, a.__dict__)
  4210.     a.bar = [
  4211.         1,
  4212.         2,
  4213.         3]
  4214.     c = copy.copy(a)
  4215.     vereq(c.bar, a.bar)
  4216.     verify(c.bar is a.bar)
  4217.     d = copy.deepcopy(a)
  4218.     vereq(d.__dict__, a.__dict__)
  4219.     a.bar.append(4)
  4220.     vereq(d.bar, [
  4221.         1,
  4222.         2,
  4223.         3])
  4224.  
  4225.  
  4226. def binopoverride():
  4227.     if verbose:
  4228.         print 'Testing overrides of binary operations...'
  4229.     
  4230.     
  4231.     class I(int):
  4232.         
  4233.         def __repr__(self):
  4234.             return 'I(%r)' % int(self)
  4235.  
  4236.         
  4237.         def __add__(self, other):
  4238.             return I(int(self) + int(other))
  4239.  
  4240.         __radd__ = __add__
  4241.         
  4242.         def __pow__(self, other, mod = None):
  4243.             if mod is None:
  4244.                 return I(pow(int(self), int(other)))
  4245.             else:
  4246.                 return I(pow(int(self), int(other), int(mod)))
  4247.  
  4248.         
  4249.         def __rpow__(self, other, mod = None):
  4250.             if mod is None:
  4251.                 return I(pow(int(other), int(self), mod))
  4252.             else:
  4253.                 return I(pow(int(other), int(self), int(mod)))
  4254.  
  4255.  
  4256.     vereq(repr(I(1) + I(2)), 'I(3)')
  4257.     vereq(repr(I(1) + 2), 'I(3)')
  4258.     vereq(repr(1 + I(2)), 'I(3)')
  4259.     vereq(repr(I(2) ** I(3)), 'I(8)')
  4260.     vereq(repr(2 ** I(3)), 'I(8)')
  4261.     vereq(repr(I(2) ** 3), 'I(8)')
  4262.     vereq(repr(pow(I(2), I(3), I(5))), 'I(3)')
  4263.     
  4264.     class S(str):
  4265.         
  4266.         def __eq__(self, other):
  4267.             return self.lower() == other.lower()
  4268.  
  4269.  
  4270.  
  4271.  
  4272. def subclasspropagation():
  4273.     if verbose:
  4274.         print 'Testing propagation of slot functions to subclasses...'
  4275.     
  4276.     
  4277.     class A(object):
  4278.         pass
  4279.  
  4280.     
  4281.     class B(A):
  4282.         pass
  4283.  
  4284.     
  4285.     class C(A):
  4286.         pass
  4287.  
  4288.     
  4289.     class D(B, C):
  4290.         pass
  4291.  
  4292.     d = D()
  4293.     vereq(hash(d), id(d))
  4294.     
  4295.     A.__hash__ = lambda self: 42
  4296.     vereq(hash(d), 42)
  4297.     
  4298.     C.__hash__ = lambda self: 314
  4299.     vereq(hash(d), 314)
  4300.     
  4301.     B.__hash__ = lambda self: 144
  4302.     vereq(hash(d), 144)
  4303.     
  4304.     D.__hash__ = lambda self: 100
  4305.     vereq(hash(d), 100)
  4306.     del D.__hash__
  4307.     vereq(hash(d), 144)
  4308.     del B.__hash__
  4309.     vereq(hash(d), 314)
  4310.     del C.__hash__
  4311.     vereq(hash(d), 42)
  4312.     del A.__hash__
  4313.     vereq(hash(d), id(d))
  4314.     d.foo = 42
  4315.     d.bar = 42
  4316.     vereq(d.foo, 42)
  4317.     vereq(d.bar, 42)
  4318.     
  4319.     def __getattribute__(self, name):
  4320.         if name == 'foo':
  4321.             return 24
  4322.         
  4323.         return object.__getattribute__(self, name)
  4324.  
  4325.     A.__getattribute__ = __getattribute__
  4326.     vereq(d.foo, 24)
  4327.     vereq(d.bar, 42)
  4328.     
  4329.     def __getattr__(self, name):
  4330.         if name in ('spam', 'foo', 'bar'):
  4331.             return 'hello'
  4332.         
  4333.         raise AttributeError, name
  4334.  
  4335.     B.__getattr__ = __getattr__
  4336.     vereq(d.spam, 'hello')
  4337.     vereq(d.foo, 24)
  4338.     vereq(d.bar, 42)
  4339.     del A.__getattribute__
  4340.     vereq(d.foo, 42)
  4341.     del d.foo
  4342.     vereq(d.foo, 'hello')
  4343.     vereq(d.bar, 42)
  4344.     del B.__getattr__
  4345.     
  4346.     try:
  4347.         d.foo
  4348.     except AttributeError:
  4349.         pass
  4350.  
  4351.     raise TestFailed, 'd.foo should be undefined now'
  4352.     import gc
  4353.     
  4354.     class A(object):
  4355.         pass
  4356.  
  4357.     
  4358.     class B(A):
  4359.         pass
  4360.  
  4361.     del B
  4362.     gc.collect()
  4363.     
  4364.     A.__setitem__ = lambda *a: pass
  4365.  
  4366.  
  4367. def buffer_inherit():
  4368.     import binascii as binascii
  4369.     if verbose:
  4370.         print 'Testing that buffer interface is inherited ...'
  4371.     
  4372.     
  4373.     class MyStr(str):
  4374.         pass
  4375.  
  4376.     base = 'abc'
  4377.     m = MyStr(base)
  4378.     vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
  4379.     
  4380.     class MyUni(unicode):
  4381.         pass
  4382.  
  4383.     base = u'abc'
  4384.     m = MyUni(base)
  4385.     vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
  4386.     
  4387.     class MyInt(int):
  4388.         pass
  4389.  
  4390.     m = MyInt(42)
  4391.     
  4392.     try:
  4393.         binascii.b2a_hex(m)
  4394.         raise TestFailed('subclass of int should not have a buffer interface')
  4395.     except TypeError:
  4396.         pass
  4397.  
  4398.  
  4399.  
  4400. def str_of_str_subclass():
  4401.     import binascii
  4402.     import cStringIO as cStringIO
  4403.     if verbose:
  4404.         print 'Testing __str__ defined in subclass of str ...'
  4405.     
  4406.     
  4407.     class octetstring(str):
  4408.         
  4409.         def __str__(self):
  4410.             return binascii.b2a_hex(self)
  4411.  
  4412.         
  4413.         def __repr__(self):
  4414.             return self + ' repr'
  4415.  
  4416.  
  4417.     o = octetstring('A')
  4418.     vereq(type(o), octetstring)
  4419.     vereq(type(str(o)), str)
  4420.     vereq(type(repr(o)), str)
  4421.     vereq(ord(o), 65)
  4422.     vereq(str(o), '41')
  4423.     vereq(repr(o), 'A repr')
  4424.     vereq(o.__str__(), '41')
  4425.     vereq(o.__repr__(), 'A repr')
  4426.     capture = cStringIO.StringIO()
  4427.     print >>capture, o
  4428.     print >>capture, str(o)
  4429.     vereq(capture.getvalue(), '41\n41\n')
  4430.     capture.close()
  4431.  
  4432.  
  4433. def kwdargs():
  4434.     if verbose:
  4435.         print 'Testing keyword arguments to __init__, __call__...'
  4436.     
  4437.     
  4438.     def f(a):
  4439.         return a
  4440.  
  4441.     vereq(f.__call__(a = 42), 42)
  4442.     a = []
  4443.     list.__init__(a, sequence = [
  4444.         0,
  4445.         1,
  4446.         2])
  4447.     vereq(a, [
  4448.         0,
  4449.         1,
  4450.         2])
  4451.  
  4452.  
  4453. def delhook():
  4454.     if verbose:
  4455.         print 'Testing __del__ hook...'
  4456.     
  4457.     log = []
  4458.     
  4459.     class C(object):
  4460.         
  4461.         def __del__(self):
  4462.             log.append(1)
  4463.  
  4464.  
  4465.     c = C()
  4466.     vereq(log, [])
  4467.     del c
  4468.     vereq(log, [
  4469.         1])
  4470.     
  4471.     class D(object):
  4472.         pass
  4473.  
  4474.     d = D()
  4475.     
  4476.     try:
  4477.         del d[0]
  4478.     except TypeError:
  4479.         pass
  4480.  
  4481.     raise TestFailed, "invalid del() didn't raise TypeError"
  4482.  
  4483.  
  4484. def hashinherit():
  4485.     if verbose:
  4486.         print 'Testing hash of mutable subclasses...'
  4487.     
  4488.     
  4489.     class mydict(dict):
  4490.         pass
  4491.  
  4492.     d = mydict()
  4493.     
  4494.     try:
  4495.         hash(d)
  4496.     except TypeError:
  4497.         pass
  4498.  
  4499.     raise TestFailed, 'hash() of dict subclass should fail'
  4500.     
  4501.     class mylist(list):
  4502.         pass
  4503.  
  4504.     d = mylist()
  4505.     
  4506.     try:
  4507.         hash(d)
  4508.     except TypeError:
  4509.         pass
  4510.  
  4511.     raise TestFailed, 'hash() of list subclass should fail'
  4512.  
  4513.  
  4514. def strops():
  4515.     
  4516.     try:
  4517.         'a' + 5
  4518.     except TypeError:
  4519.         pass
  4520.  
  4521.     raise TestFailed, "'' + 5 doesn't raise TypeError"
  4522.     
  4523.     try:
  4524.         ''.split('')
  4525.     except ValueError:
  4526.         pass
  4527.  
  4528.     raise TestFailed, "''.split('') doesn't raise ValueError"
  4529.     
  4530.     try:
  4531.         ''.join([
  4532.             0])
  4533.     except TypeError:
  4534.         pass
  4535.  
  4536.     raise TestFailed, "''.join([0]) doesn't raise TypeError"
  4537.     
  4538.     try:
  4539.         ''.rindex('5')
  4540.     except ValueError:
  4541.         pass
  4542.  
  4543.     raise TestFailed, "''.rindex('5') doesn't raise ValueError"
  4544.     
  4545.     try:
  4546.         '%(n)s' % None
  4547.     except TypeError:
  4548.         pass
  4549.  
  4550.     raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
  4551.     
  4552.     try:
  4553.         '%(n' % { }
  4554.     except ValueError:
  4555.         pass
  4556.  
  4557.     raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
  4558.     
  4559.     try:
  4560.         '%*s' % 'abc'
  4561.     except TypeError:
  4562.         pass
  4563.  
  4564.     raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
  4565.     
  4566.     try:
  4567.         '%*.*s' % ('abc', 5)
  4568.     except TypeError:
  4569.         pass
  4570.  
  4571.     raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
  4572.     
  4573.     try:
  4574.         '%s' % (1, 2)
  4575.     except TypeError:
  4576.         pass
  4577.  
  4578.     raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
  4579.     
  4580.     try:
  4581.         '%' % None
  4582.     except ValueError:
  4583.         pass
  4584.  
  4585.     raise TestFailed, "'%' % None doesn't raise ValueError"
  4586.     vereq('534253'.isdigit(), 1)
  4587.     vereq('534253x'.isdigit(), 0)
  4588.     vereq('%c' % 5, '\x05')
  4589.     vereq('%c' % '5', '5')
  4590.  
  4591.  
  4592. def deepcopyrecursive():
  4593.     if verbose:
  4594.         print 'Testing deepcopy of recursive objects...'
  4595.     
  4596.     
  4597.     class Node:
  4598.         pass
  4599.  
  4600.     a = Node()
  4601.     b = Node()
  4602.     a.b = b
  4603.     b.a = a
  4604.     z = deepcopy(a)
  4605.  
  4606.  
  4607. def modules():
  4608.     if verbose:
  4609.         print 'Testing uninitialized module objects...'
  4610.     
  4611.     M = ModuleType
  4612.     import types
  4613.     m = M.__new__(M)
  4614.     str(m)
  4615.     vereq(hasattr(m, '__name__'), 0)
  4616.     vereq(hasattr(m, '__file__'), 0)
  4617.     vereq(hasattr(m, 'foo'), 0)
  4618.     vereq(m.__dict__, None)
  4619.     m.foo = 1
  4620.     vereq(m.__dict__, {
  4621.         'foo': 1 })
  4622.  
  4623.  
  4624. def dictproxyiterkeys():
  4625.     
  4626.     class C(object):
  4627.         
  4628.         def meth(self):
  4629.             pass
  4630.  
  4631.  
  4632.     if verbose:
  4633.         print 'Testing dict-proxy iterkeys...'
  4634.     
  4635.     keys = [ key for key in C.__dict__.iterkeys() ]
  4636.     keys.sort()
  4637.     vereq(keys, [
  4638.         '__dict__',
  4639.         '__doc__',
  4640.         '__module__',
  4641.         '__weakref__',
  4642.         'meth'])
  4643.  
  4644.  
  4645. def dictproxyitervalues():
  4646.     
  4647.     class C(object):
  4648.         
  4649.         def meth(self):
  4650.             pass
  4651.  
  4652.  
  4653.     if verbose:
  4654.         print 'Testing dict-proxy itervalues...'
  4655.     
  4656.     values = [ values for values in C.__dict__.itervalues() ]
  4657.     vereq(len(values), 5)
  4658.  
  4659.  
  4660. def dictproxyiteritems():
  4661.     
  4662.     class C(object):
  4663.         
  4664.         def meth(self):
  4665.             pass
  4666.  
  4667.  
  4668.     if verbose:
  4669.         print 'Testing dict-proxy iteritems...'
  4670.     
  4671.     keys = [ key for key, value in C.__dict__.iteritems() ]
  4672.     keys.sort()
  4673.     vereq(keys, [
  4674.         '__dict__',
  4675.         '__doc__',
  4676.         '__module__',
  4677.         '__weakref__',
  4678.         'meth'])
  4679.  
  4680.  
  4681. def funnynew():
  4682.     if verbose:
  4683.         print 'Testing __new__ returning something unexpected...'
  4684.     
  4685.     
  4686.     class C(object):
  4687.         
  4688.         def __new__(cls, arg):
  4689.             if isinstance(arg, str):
  4690.                 return [
  4691.                     1,
  4692.                     2,
  4693.                     3]
  4694.             elif isinstance(arg, int):
  4695.                 return object.__new__(D)
  4696.             else:
  4697.                 return object.__new__(cls)
  4698.  
  4699.  
  4700.     
  4701.     class D(C):
  4702.         
  4703.         def __init__(self, arg):
  4704.             self.foo = arg
  4705.  
  4706.  
  4707.     vereq(C('1'), [
  4708.         1,
  4709.         2,
  4710.         3])
  4711.     vereq(D('1'), [
  4712.         1,
  4713.         2,
  4714.         3])
  4715.     d = D(None)
  4716.     veris(d.foo, None)
  4717.     d = C(1)
  4718.     vereq(isinstance(d, D), True)
  4719.     vereq(d.foo, 1)
  4720.     d = D(1)
  4721.     vereq(isinstance(d, D), True)
  4722.     vereq(d.foo, 1)
  4723.  
  4724.  
  4725. def imulbug():
  4726.     if verbose:
  4727.         print 'Testing for __imul__ problems...'
  4728.     
  4729.     
  4730.     class C(object):
  4731.         
  4732.         def __imul__(self, other):
  4733.             return (self, other)
  4734.  
  4735.  
  4736.     x = C()
  4737.     y = x
  4738.     y *= 1.0
  4739.     vereq(y, (x, 1.0))
  4740.     y = x
  4741.     y *= 2
  4742.     vereq(y, (x, 2))
  4743.     y = x
  4744.     y *= 0x3L
  4745.     vereq(y, (x, 0x3L))
  4746.     y = x
  4747.     y *= 0x1L << 100
  4748.     vereq(y, (x, 0x1L << 100))
  4749.     y = x
  4750.     y *= None
  4751.     vereq(y, (x, None))
  4752.     y = x
  4753.     y *= 'foo'
  4754.     vereq(y, (x, 'foo'))
  4755.  
  4756.  
  4757. def docdescriptor():
  4758.     if verbose:
  4759.         print 'Testing __doc__ descriptor...'
  4760.     
  4761.     
  4762.     class DocDescr(object):
  4763.         
  4764.         def __get__(self, object, otype):
  4765.             if object:
  4766.                 object = object.__class__.__name__ + ' instance'
  4767.             
  4768.             if otype:
  4769.                 otype = otype.__name__
  4770.             
  4771.             return 'object=%s; type=%s' % (object, otype)
  4772.  
  4773.  
  4774.     
  4775.     class OldClass:
  4776.         __doc__ = DocDescr()
  4777.  
  4778.     
  4779.     class NewClass(object):
  4780.         __doc__ = DocDescr()
  4781.  
  4782.     vereq(OldClass.__doc__, 'object=None; type=OldClass')
  4783.     vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
  4784.     vereq(NewClass.__doc__, 'object=None; type=NewClass')
  4785.     vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
  4786.  
  4787.  
  4788. def string_exceptions():
  4789.     if verbose:
  4790.         print 'Testing string exceptions ...'
  4791.     
  4792.     astring = 'An exception string.'
  4793.     
  4794.     try:
  4795.         raise astring
  4796.     except astring:
  4797.         pass
  4798.  
  4799.     raise TestFailed, 'builtin string not usable as exception'
  4800.     
  4801.     class MyStr(str):
  4802.         pass
  4803.  
  4804.     newstring = MyStr("oops -- shouldn't work")
  4805.     
  4806.     try:
  4807.         raise newstring
  4808.     except TypeError:
  4809.         pass
  4810.     except:
  4811.         raise TestFailed, 'string subclass allowed as exception'
  4812.  
  4813.  
  4814.  
  4815. def copy_setstate():
  4816.     if verbose:
  4817.         print 'Testing that copy.*copy() correctly uses __setstate__...'
  4818.     
  4819.     import copy
  4820.     
  4821.     class C(object):
  4822.         
  4823.         def __init__(self, foo = None):
  4824.             self.foo = foo
  4825.             self._C__foo = foo
  4826.  
  4827.         
  4828.         def setfoo(self, foo = None):
  4829.             self.foo = foo
  4830.  
  4831.         
  4832.         def getfoo(self):
  4833.             return self._C__foo
  4834.  
  4835.         
  4836.         def __getstate__(self):
  4837.             return [
  4838.                 self.foo]
  4839.  
  4840.         
  4841.         def __setstate__(self, lst):
  4842.             if not len(lst) == 1:
  4843.                 raise AssertionError
  4844.             self._C__foo = self.foo = lst[0]
  4845.  
  4846.  
  4847.     a = C(42)
  4848.     a.setfoo(24)
  4849.     vereq(a.foo, 24)
  4850.     vereq(a.getfoo(), 42)
  4851.     b = copy.copy(a)
  4852.     vereq(b.foo, 24)
  4853.     vereq(b.getfoo(), 24)
  4854.     b = copy.deepcopy(a)
  4855.     vereq(b.foo, 24)
  4856.     vereq(b.getfoo(), 24)
  4857.  
  4858.  
  4859. def slices():
  4860.     if verbose:
  4861.         print 'Testing cases with slices and overridden __getitem__ ...'
  4862.     
  4863.     vereq('hello'[:4], 'hell')
  4864.     vereq('hello'[slice(4)], 'hell')
  4865.     vereq(str.__getitem__('hello', slice(4)), 'hell')
  4866.     
  4867.     class S(str):
  4868.         
  4869.         def __getitem__(self, x):
  4870.             return str.__getitem__(self, x)
  4871.  
  4872.  
  4873.     vereq(S('hello')[:4], 'hell')
  4874.     vereq(S('hello')[slice(4)], 'hell')
  4875.     vereq(S('hello').__getitem__(slice(4)), 'hell')
  4876.     vereq((1, 2, 3)[:2], (1, 2))
  4877.     vereq((1, 2, 3)[slice(2)], (1, 2))
  4878.     vereq(tuple.__getitem__((1, 2, 3), slice(2)), (1, 2))
  4879.     
  4880.     class T(tuple):
  4881.         
  4882.         def __getitem__(self, x):
  4883.             return tuple.__getitem__(self, x)
  4884.  
  4885.  
  4886.     vereq(T((1, 2, 3))[:2], (1, 2))
  4887.     vereq(T((1, 2, 3))[slice(2)], (1, 2))
  4888.     vereq(T((1, 2, 3)).__getitem__(slice(2)), (1, 2))
  4889.     vereq([
  4890.         1,
  4891.         2,
  4892.         3][:2], [
  4893.         1,
  4894.         2])
  4895.     vereq([
  4896.         1,
  4897.         2,
  4898.         3][slice(2)], [
  4899.         1,
  4900.         2])
  4901.     vereq(list.__getitem__([
  4902.         1,
  4903.         2,
  4904.         3], slice(2)), [
  4905.         1,
  4906.         2])
  4907.     
  4908.     class L(list):
  4909.         
  4910.         def __getitem__(self, x):
  4911.             return list.__getitem__(self, x)
  4912.  
  4913.  
  4914.     vereq(L([
  4915.         1,
  4916.         2,
  4917.         3])[:2], [
  4918.         1,
  4919.         2])
  4920.     vereq(L([
  4921.         1,
  4922.         2,
  4923.         3])[slice(2)], [
  4924.         1,
  4925.         2])
  4926.     vereq(L([
  4927.         1,
  4928.         2,
  4929.         3]).__getitem__(slice(2)), [
  4930.         1,
  4931.         2])
  4932.     a = L([
  4933.         1,
  4934.         2,
  4935.         3])
  4936.     a[slice(1, 3)] = [
  4937.         3,
  4938.         2]
  4939.     vereq(a, [
  4940.         1,
  4941.         3,
  4942.         2])
  4943.     a[slice(0, 2, 1)] = [
  4944.         3,
  4945.         1]
  4946.     vereq(a, [
  4947.         3,
  4948.         1,
  4949.         2])
  4950.     a.__setitem__(slice(1, 3), [
  4951.         2,
  4952.         1])
  4953.     vereq(a, [
  4954.         3,
  4955.         2,
  4956.         1])
  4957.     a.__setitem__(slice(0, 2, 1), [
  4958.         2,
  4959.         3])
  4960.     vereq(a, [
  4961.         2,
  4962.         3,
  4963.         1])
  4964.  
  4965.  
  4966. def subtype_resurrection():
  4967.     if verbose:
  4968.         print 'Testing resurrection of new-style instance...'
  4969.     
  4970.     
  4971.     class C(object):
  4972.         container = []
  4973.         
  4974.         def __del__(self):
  4975.             C.container.append(self)
  4976.  
  4977.  
  4978.     c = C()
  4979.     c.attr = 42
  4980.     del c
  4981.     del C.container[-1]
  4982.     vereq(len(C.container), 1)
  4983.     vereq(C.container[-1].attr, 42)
  4984.     del C.__del__
  4985.  
  4986.  
  4987. def slottrash():
  4988.     if verbose:
  4989.         print 'Testing slot trash...'
  4990.     
  4991.     
  4992.     class trash(object):
  4993.         __slots__ = [
  4994.             'x']
  4995.         
  4996.         def __init__(self, x):
  4997.             self.x = x
  4998.  
  4999.  
  5000.     o = None
  5001.     for i in xrange(50000):
  5002.         o = trash(o)
  5003.     
  5004.     del o
  5005.  
  5006.  
  5007. def slotmultipleinheritance():
  5008.     
  5009.     class A(object):
  5010.         __slots__ = ()
  5011.  
  5012.     
  5013.     class B(object):
  5014.         pass
  5015.  
  5016.     
  5017.     class C(A, B):
  5018.         __slots__ = ()
  5019.  
  5020.     vereq(C.__basicsize__, B.__basicsize__)
  5021.     verify(hasattr(C, '__dict__'))
  5022.     verify(hasattr(C, '__weakref__'))
  5023.     C().x = 2
  5024.  
  5025.  
  5026. def testrmul():
  5027.     if verbose:
  5028.         print 'Testing correct invocation of __rmul__...'
  5029.     
  5030.     
  5031.     class C(object):
  5032.         
  5033.         def __mul__(self, other):
  5034.             return 'mul'
  5035.  
  5036.         
  5037.         def __rmul__(self, other):
  5038.             return 'rmul'
  5039.  
  5040.  
  5041.     a = C()
  5042.     vereq(a * 2, 'mul')
  5043.     vereq(a * 2.2000000000000002, 'mul')
  5044.     vereq(2 * a, 'rmul')
  5045.     vereq(2.2000000000000002 * a, 'rmul')
  5046.  
  5047.  
  5048. def testipow():
  5049.     if verbose:
  5050.         print 'Testing correct invocation of __ipow__...'
  5051.     
  5052.     
  5053.     class C(object):
  5054.         
  5055.         def __ipow__(self, other):
  5056.             pass
  5057.  
  5058.  
  5059.     a = C()
  5060.     a **= 2
  5061.  
  5062.  
  5063. def do_this_first():
  5064.     if verbose:
  5065.         print 'Testing SF bug 551412 ...'
  5066.     
  5067.     
  5068.     class UserLong(object):
  5069.         
  5070.         def __pow__(self, *args):
  5071.             pass
  5072.  
  5073.  
  5074.     
  5075.     try:
  5076.         pow(0x0L, UserLong(), 0x0L)
  5077.     except:
  5078.         pass
  5079.  
  5080.     if verbose:
  5081.         print 'Testing SF bug 570483...'
  5082.     
  5083.     type.mro(tuple)
  5084.  
  5085.  
  5086. def test_mutable_bases():
  5087.     if verbose:
  5088.         print 'Testing mutable bases...'
  5089.     
  5090.     
  5091.     class C(object):
  5092.         pass
  5093.  
  5094.     
  5095.     class C2(object):
  5096.         
  5097.         def __getattribute__(self, attr):
  5098.             if attr == 'a':
  5099.                 return 2
  5100.             else:
  5101.                 return super(C2, self).__getattribute__(attr)
  5102.  
  5103.         
  5104.         def meth(self):
  5105.             return 1
  5106.  
  5107.  
  5108.     
  5109.     class D(C):
  5110.         pass
  5111.  
  5112.     
  5113.     class E(D):
  5114.         pass
  5115.  
  5116.     d = D()
  5117.     e = E()
  5118.     D.__bases__ = (C,)
  5119.     D.__bases__ = (C2,)
  5120.     vereq(d.meth(), 1)
  5121.     vereq(e.meth(), 1)
  5122.     vereq(d.a, 2)
  5123.     vereq(e.a, 2)
  5124.     vereq(C2.__subclasses__(), [
  5125.         D])
  5126.     
  5127.     class L(list):
  5128.         pass
  5129.  
  5130.     
  5131.     try:
  5132.         L.__bases__ = (dict,)
  5133.     except TypeError:
  5134.         pass
  5135.  
  5136.     raise TestFailed, "shouldn't turn list subclass into dict subclass"
  5137.     
  5138.     try:
  5139.         list.__bases__ = (dict,)
  5140.     except TypeError:
  5141.         pass
  5142.  
  5143.     raise TestFailed, "shouldn't be able to assign to list.__bases__"
  5144.     
  5145.     try:
  5146.         del D.__bases__
  5147.     except TypeError:
  5148.         pass
  5149.  
  5150.     raise TestFailed, "shouldn't be able to delete .__bases__"
  5151.     
  5152.     try:
  5153.         D.__bases__ = ()
  5154.     except TypeError:
  5155.         msg = None
  5156.         if str(msg) == "a new-style class can't have only classic bases":
  5157.             raise TestFailed, 'wrong error message for .__bases__ = ()'
  5158.         
  5159.     except:
  5160.         str(msg) == "a new-style class can't have only classic bases"
  5161.  
  5162.     raise TestFailed, "shouldn't be able to set .__bases__ to ()"
  5163.     
  5164.     try:
  5165.         D.__bases__ = (D,)
  5166.     except TypeError:
  5167.         pass
  5168.  
  5169.     raise TestFailed, "shouldn't be able to create inheritance cycles"
  5170.     
  5171.     try:
  5172.         D.__bases__ = (C, C)
  5173.     except TypeError:
  5174.         pass
  5175.  
  5176.     raise TestFailed, "didn't detect repeated base classes"
  5177.     
  5178.     try:
  5179.         D.__bases__ = (E,)
  5180.     except TypeError:
  5181.         pass
  5182.  
  5183.     raise TestFailed, "shouldn't be able to create inheritance cycles"
  5184.     
  5185.     class Classic:
  5186.         
  5187.         def meth2(self):
  5188.             return 3
  5189.  
  5190.  
  5191.     D.__bases__ = (C, Classic)
  5192.     vereq(d.meth2(), 3)
  5193.     vereq(e.meth2(), 3)
  5194.     
  5195.     try:
  5196.         d.a
  5197.     except AttributeError:
  5198.         pass
  5199.  
  5200.     raise TestFailed, 'attribute should have vanished'
  5201.     
  5202.     try:
  5203.         D.__bases__ = (Classic,)
  5204.     except TypeError:
  5205.         pass
  5206.  
  5207.     raise TestFailed, 'new-style class must have a new-style base'
  5208.  
  5209.  
  5210. def test_mutable_bases_with_failing_mro():
  5211.     if verbose:
  5212.         print 'Testing mutable bases with failing mro...'
  5213.     
  5214.     
  5215.     class WorkOnce(type):
  5216.         
  5217.         def __new__(self, name, bases, ns):
  5218.             self.flag = 0
  5219.             return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
  5220.  
  5221.         
  5222.         def mro(self):
  5223.             pass
  5224.  
  5225.  
  5226.     
  5227.     class WorkAlways(type):
  5228.         
  5229.         def mro(self):
  5230.             return type.mro(self)
  5231.  
  5232.  
  5233.     
  5234.     class C(object):
  5235.         pass
  5236.  
  5237.     
  5238.     class C2(object):
  5239.         pass
  5240.  
  5241.     
  5242.     class D(C):
  5243.         pass
  5244.  
  5245.     
  5246.     class E(D):
  5247.         pass
  5248.  
  5249.     
  5250.     class F(D):
  5251.         __metaclass__ = WorkOnce
  5252.  
  5253.     
  5254.     class G(D):
  5255.         __metaclass__ = WorkAlways
  5256.  
  5257.     E_mro_before = E.__mro__
  5258.     D_mro_before = D.__mro__
  5259.     
  5260.     try:
  5261.         D.__bases__ = (C2,)
  5262.     except RuntimeError:
  5263.         vereq(E.__mro__, E_mro_before)
  5264.         vereq(D.__mro__, D_mro_before)
  5265.  
  5266.     raise TestFailed, 'exception not propagated'
  5267.  
  5268.  
  5269. def test_mutable_bases_catch_mro_conflict():
  5270.     if verbose:
  5271.         print 'Testing mutable bases catch mro conflict...'
  5272.     
  5273.     
  5274.     class A(object):
  5275.         pass
  5276.  
  5277.     
  5278.     class B(object):
  5279.         pass
  5280.  
  5281.     
  5282.     class C(A, B):
  5283.         pass
  5284.  
  5285.     
  5286.     class D(A, B):
  5287.         pass
  5288.  
  5289.     
  5290.     class E(C, D):
  5291.         pass
  5292.  
  5293.     
  5294.     try:
  5295.         C.__bases__ = (B, A)
  5296.     except TypeError:
  5297.         pass
  5298.  
  5299.     raise TestFailed, "didn't catch MRO conflict"
  5300.  
  5301.  
  5302. def mutable_names():
  5303.     if verbose:
  5304.         print 'Testing mutable names...'
  5305.     
  5306.     
  5307.     class C(object):
  5308.         pass
  5309.  
  5310.     mod = C.__module__
  5311.     C.__name__ = 'D'
  5312.     vereq((C.__module__, C.__name__), (mod, 'D'))
  5313.     C.__name__ = 'D.E'
  5314.     vereq((C.__module__, C.__name__), (mod, 'D.E'))
  5315.  
  5316.  
  5317. def subclass_right_op():
  5318.     if verbose:
  5319.         print 'Testing correct dispatch of subclass overloading __r<op>__...'
  5320.     
  5321.     
  5322.     class B(int):
  5323.         
  5324.         def __floordiv__(self, other):
  5325.             return 'B.__floordiv__'
  5326.  
  5327.         
  5328.         def __rfloordiv__(self, other):
  5329.             return 'B.__rfloordiv__'
  5330.  
  5331.  
  5332.     vereq(B(1) // 1, 'B.__floordiv__')
  5333.     vereq(1 // B(1), 'B.__rfloordiv__')
  5334.     
  5335.     class C(object):
  5336.         
  5337.         def __floordiv__(self, other):
  5338.             return 'C.__floordiv__'
  5339.  
  5340.         
  5341.         def __rfloordiv__(self, other):
  5342.             return 'C.__rfloordiv__'
  5343.  
  5344.  
  5345.     vereq(C() // 1, 'C.__floordiv__')
  5346.     vereq(1 // C(), 'C.__rfloordiv__')
  5347.     
  5348.     class D(C):
  5349.         
  5350.         def __floordiv__(self, other):
  5351.             return 'D.__floordiv__'
  5352.  
  5353.         
  5354.         def __rfloordiv__(self, other):
  5355.             return 'D.__rfloordiv__'
  5356.  
  5357.  
  5358.     vereq(D() // C(), 'D.__floordiv__')
  5359.     vereq(C() // D(), 'D.__rfloordiv__')
  5360.     
  5361.     class E(C):
  5362.         pass
  5363.  
  5364.     vereq(E.__rfloordiv__, C.__rfloordiv__)
  5365.     vereq(E() // 1, 'C.__floordiv__')
  5366.     vereq(1 // E(), 'C.__rfloordiv__')
  5367.     vereq(E() // C(), 'C.__floordiv__')
  5368.     vereq(C() // E(), 'C.__floordiv__')
  5369.  
  5370.  
  5371. def dict_type_with_metaclass():
  5372.     if verbose:
  5373.         print 'Testing type of __dict__ when __metaclass__ set...'
  5374.     
  5375.     
  5376.     class B(object):
  5377.         pass
  5378.  
  5379.     
  5380.     class M(type):
  5381.         pass
  5382.  
  5383.     
  5384.     class C:
  5385.         __metaclass__ = M
  5386.  
  5387.     veris(type(C.__dict__), type(B.__dict__))
  5388.  
  5389.  
  5390. def meth_class_get():
  5391.     if verbose:
  5392.         print 'Testing __get__ method of METH_CLASS C methods...'
  5393.     
  5394.     arg = [
  5395.         1,
  5396.         2,
  5397.         3]
  5398.     res = {
  5399.         1: None,
  5400.         2: None,
  5401.         3: None }
  5402.     vereq(dict.fromkeys(arg), res)
  5403.     vereq({ }.fromkeys(arg), res)
  5404.     descr = dict.__dict__['fromkeys']
  5405.     vereq(descr.__get__(None, dict)(arg), res)
  5406.     vereq(descr.__get__({ })(arg), res)
  5407.     
  5408.     try:
  5409.         descr.__get__(None, None)
  5410.     except TypeError:
  5411.         pass
  5412.  
  5413.     raise TestFailed, "shouldn't have allowed descr.__get__(None, None)"
  5414.     
  5415.     try:
  5416.         descr.__get__(42)
  5417.     except TypeError:
  5418.         pass
  5419.  
  5420.     raise TestFailed, "shouldn't have allowed descr.__get__(42)"
  5421.     
  5422.     try:
  5423.         descr.__get__(None, 42)
  5424.     except TypeError:
  5425.         pass
  5426.  
  5427.     raise TestFailed, "shouldn't have allowed descr.__get__(None, 42)"
  5428.     
  5429.     try:
  5430.         descr.__get__(None, int)
  5431.     except TypeError:
  5432.         pass
  5433.  
  5434.     raise TestFailed, "shouldn't have allowed descr.__get__(None, int)"
  5435.  
  5436.  
  5437. def isinst_isclass():
  5438.     if verbose:
  5439.         print 'Testing proxy isinstance() and isclass()...'
  5440.     
  5441.     
  5442.     class Proxy(object):
  5443.         
  5444.         def __init__(self, obj):
  5445.             self._Proxy__obj = obj
  5446.  
  5447.         
  5448.         def __getattribute__(self, name):
  5449.             if name.startswith('_Proxy__'):
  5450.                 return object.__getattribute__(self, name)
  5451.             else:
  5452.                 return getattr(self._Proxy__obj, name)
  5453.  
  5454.  
  5455.     
  5456.     class C:
  5457.         pass
  5458.  
  5459.     a = C()
  5460.     pa = Proxy(a)
  5461.     verify(isinstance(a, C))
  5462.     verify(isinstance(pa, C))
  5463.     
  5464.     class D(C):
  5465.         pass
  5466.  
  5467.     a = D()
  5468.     pa = Proxy(a)
  5469.     verify(isinstance(a, C))
  5470.     verify(isinstance(pa, C))
  5471.     
  5472.     class C(object):
  5473.         pass
  5474.  
  5475.     a = C()
  5476.     pa = Proxy(a)
  5477.     verify(isinstance(a, C))
  5478.     verify(isinstance(pa, C))
  5479.     
  5480.     class D(C):
  5481.         pass
  5482.  
  5483.     a = D()
  5484.     pa = Proxy(a)
  5485.     verify(isinstance(a, C))
  5486.     verify(isinstance(pa, C))
  5487.  
  5488.  
  5489. def proxysuper():
  5490.     if verbose:
  5491.         print 'Testing super() for a proxy object...'
  5492.     
  5493.     
  5494.     class Proxy(object):
  5495.         
  5496.         def __init__(self, obj):
  5497.             self._Proxy__obj = obj
  5498.  
  5499.         
  5500.         def __getattribute__(self, name):
  5501.             if name.startswith('_Proxy__'):
  5502.                 return object.__getattribute__(self, name)
  5503.             else:
  5504.                 return getattr(self._Proxy__obj, name)
  5505.  
  5506.  
  5507.     
  5508.     class B(object):
  5509.         
  5510.         def f(self):
  5511.             return 'B.f'
  5512.  
  5513.  
  5514.     
  5515.     class C(B):
  5516.         
  5517.         def f(self):
  5518.             return super(C, self).f() + '->C.f'
  5519.  
  5520.  
  5521.     obj = C()
  5522.     p = Proxy(obj)
  5523.     vereq(C.__dict__['f'](p), 'B.f->C.f')
  5524.  
  5525.  
  5526. def carloverre():
  5527.     if verbose:
  5528.         print "Testing prohibition of Carlo Verre's hack..."
  5529.     
  5530.     
  5531.     try:
  5532.         object.__setattr__(str, 'foo', 42)
  5533.     except TypeError:
  5534.         pass
  5535.  
  5536.     raise TestFailed, 'Carlo Verre __setattr__ suceeded!'
  5537.     
  5538.     try:
  5539.         object.__delattr__(str, 'lower')
  5540.     except TypeError:
  5541.         pass
  5542.  
  5543.     raise TestFailed, 'Carlo Verre __delattr__ succeeded!'
  5544.  
  5545.  
  5546. def weakref_segfault():
  5547.     if verbose:
  5548.         print 'Testing weakref segfault...'
  5549.     
  5550.     import weakref
  5551.     
  5552.     class Provoker:
  5553.         
  5554.         def __init__(self, referrent):
  5555.             self.ref = weakref.ref(referrent)
  5556.  
  5557.         
  5558.         def __del__(self):
  5559.             x = self.ref()
  5560.  
  5561.  
  5562.     
  5563.     class Oops(object):
  5564.         pass
  5565.  
  5566.     o = Oops()
  5567.     o.whatever = Provoker(o)
  5568.     del o
  5569.  
  5570.  
  5571. def filefault():
  5572.     if verbose:
  5573.         print 'Testing sys.stdout is changed in getattr...'
  5574.     
  5575.     import sys
  5576.     
  5577.     class StdoutGuard:
  5578.         
  5579.         def __getattr__(self, attr):
  5580.             sys.stdout = sys.__stdout__
  5581.             raise RuntimeError('Premature access to sys.stdout.%s' % attr)
  5582.  
  5583.  
  5584.     sys.stdout = StdoutGuard()
  5585.     
  5586.     try:
  5587.         print 'Oops!'
  5588.     except RuntimeError:
  5589.         pass
  5590.  
  5591.  
  5592.  
  5593. def vicious_descriptor_nonsense():
  5594.     if verbose:
  5595.         print 'Testing vicious_descriptor_nonsense...'
  5596.     
  5597.     
  5598.     class Evil(object):
  5599.         
  5600.         def __hash__(self):
  5601.             return hash('attr')
  5602.  
  5603.         
  5604.         def __eq__(self, other):
  5605.             del C.attr
  5606.             return 0
  5607.  
  5608.  
  5609.     
  5610.     class Descr(object):
  5611.         
  5612.         def __get__(self, ob, type = None):
  5613.             return 1
  5614.  
  5615.  
  5616.     
  5617.     class C(object):
  5618.         attr = Descr()
  5619.  
  5620.     c = C()
  5621.     c.__dict__[Evil()] = 0
  5622.     vereq(c.attr, 1)
  5623.     import gc
  5624.     gc.collect()
  5625.     vereq(hasattr(c, 'attr'), False)
  5626.  
  5627. import warnings
  5628.  
  5629. def test_init():
  5630.     
  5631.     class Foo(object):
  5632.         
  5633.         def __init__(self):
  5634.             return 10
  5635.  
  5636.  
  5637.     oldfilters = warnings.filters[:]
  5638.     
  5639.     try:
  5640.         warnings.filterwarnings('error', category = RuntimeWarning)
  5641.         
  5642.         try:
  5643.             Foo()
  5644.         except RuntimeWarning:
  5645.             pass
  5646.  
  5647.         raise TestFailed, 'did not test __init__() for None return'
  5648.     finally:
  5649.         warnings.filters = oldfilters
  5650.  
  5651.  
  5652.  
  5653. def test_main():
  5654.     weakref_segfault()
  5655.     do_this_first()
  5656.     class_docstrings()
  5657.     lists()
  5658.     dicts()
  5659.     dict_constructor()
  5660.     test_dir()
  5661.     ints()
  5662.     longs()
  5663.     floats()
  5664.     complexes()
  5665.     spamlists()
  5666.     spamdicts()
  5667.     pydicts()
  5668.     pylists()
  5669.     metaclass()
  5670.     pymods()
  5671.     multi()
  5672.     mro_disagreement()
  5673.     diamond()
  5674.     ex5()
  5675.     monotonicity()
  5676.     consistency_with_epg()
  5677.     objects()
  5678.     slots()
  5679.     slotspecials()
  5680.     dynamics()
  5681.     errors()
  5682.     classmethods()
  5683.     classmethods_in_c()
  5684.     staticmethods()
  5685.     staticmethods_in_c()
  5686.     classic()
  5687.     compattr()
  5688.     newslot()
  5689.     altmro()
  5690.     overloading()
  5691.     methods()
  5692.     specials()
  5693.     weakrefs()
  5694.     properties()
  5695.     supers()
  5696.     inherits()
  5697.     keywords()
  5698.     restricted()
  5699.     str_subclass_as_dict_key()
  5700.     classic_comparisons()
  5701.     rich_comparisons()
  5702.     coercions()
  5703.     descrdoc()
  5704.     setclass()
  5705.     setdict()
  5706.     pickles()
  5707.     copies()
  5708.     binopoverride()
  5709.     subclasspropagation()
  5710.     buffer_inherit()
  5711.     str_of_str_subclass()
  5712.     kwdargs()
  5713.     delhook()
  5714.     hashinherit()
  5715.     strops()
  5716.     deepcopyrecursive()
  5717.     modules()
  5718.     dictproxyiterkeys()
  5719.     dictproxyitervalues()
  5720.     dictproxyiteritems()
  5721.     pickleslots()
  5722.     funnynew()
  5723.     imulbug()
  5724.     docdescriptor()
  5725.     string_exceptions()
  5726.     copy_setstate()
  5727.     slices()
  5728.     subtype_resurrection()
  5729.     slottrash()
  5730.     slotmultipleinheritance()
  5731.     testrmul()
  5732.     testipow()
  5733.     test_mutable_bases()
  5734.     test_mutable_bases_with_failing_mro()
  5735.     test_mutable_bases_catch_mro_conflict()
  5736.     mutable_names()
  5737.     subclass_right_op()
  5738.     dict_type_with_metaclass()
  5739.     meth_class_get()
  5740.     isinst_isclass()
  5741.     proxysuper()
  5742.     carloverre()
  5743.     filefault()
  5744.     vicious_descriptor_nonsense()
  5745.     test_init()
  5746.     if verbose:
  5747.         print 'All OK'
  5748.     
  5749.  
  5750. if __name__ == '__main__':
  5751.     test_main()
  5752.  
  5753.